文件是连续的字节序列,数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成。文件对象不仅可以用来访问普通的磁盘文件,而且也可以访问任何其它类型抽象层面上的文件。
内建函数open()和file()都可以用来打开文件,后者是python2.2加入的,统一了类型和类,file()就是个工厂函数,与open()有相同的功能。open()语法如下:
file_object = open(file_name, access_mode = 'r', buffering = -1);
file_name是包含要打开的文件名字的字符串,它可以是相对路径或者绝对路径,access_mode也是一个字符串,代表打开文件的模式,通常,文件使用模式r、w或是a模式来打开,分别代表读取、写入和追加,还有个U模式,代表通用换行符支持。buffering用于指示访问文件所采用的缓冲方式,其中0表示不缓冲,1表示只缓冲一行数据,任何其它大于1的值代表使用给定值作为缓冲区大小,不提供该参数或者给定负值代表系统默认缓冲机制。os模块提供了处理行结束符的属性。
1、下面是文件操作相关的内建方法
read():直接读取字节到字符串中,最多读取给定数目个字节,如果没有给定size参数(默认为-1)或者size值为负,文件将被读取直至末尾。
readline():读取打开文件的一行,即读取下个行结束符之前的所有字节,包括行结束符,作为字符串返回,和read()相同,它也有一个可选的size参数。
readlines():读取所有剩余的行,然后把它们作为一个字符串列表返回,可选参数sizhint代表返回的最大字节大小,如果它大于0,因为需要凑齐缓冲区大小,那么返回的所有行字节大小可能稍微大于sizhint。xreadlines模块中的xreadlines对象可用来高效地迭代文件的行,但也不常用,因为使用迭代器或文件迭代就够了。
readinto():已废弃,读取给定数目的字节到一个可写的缓冲器对象,和废弃的buffer()内建函数返回的对象是同个类型。
write():写文件,功能同read()。
writelines():写文件,功能同readlines()。
next():返回文件的下一行,或在没有其它行时引发StopIteration异常。
seek():在文件中移动文件指针到不同的位置,类似于C语言的fseek()。
text():返回当前文件指针在文件中的位置,是对seek()的补充。
close():关闭文件,结束对文件的访问。
fileno():返回打开文件的描述符,是一个整数。
flush():直接把内部缓冲区中的数据立刻写入文件,而不是被动地等待输出缓冲区被写入。
isatty():当文件是一个类tty设备时返回True。
truncate():将文件截取到当前文件指针位置或者到给定size,以字节为单位。
**注意:上面的读文件函数,不会删除行结束符,同样,写文件函数,也不会自动加入行结束符,这个需要我们自己完成。print语句默认在输出内容末尾后加一个换行符,而在语句后加一个逗号就可以避免这个行为。raw_input()不会保留用户输入的换行符。
2、行分隔符与路径分隔符
操作系统间的差异之一是它们所支持的行分隔符不同,另个不同是路径分隔符,当我们创建要跨几个平台的应用的时候,这些差异会让我们感觉非常麻烦。幸运的是,os模块帮我们解决了这些问题,os模块有五个很有用的属性,这些属性自动会被设置为正确的值。
linesep:用于在文件中分隔行的字符串(linux下为'\n')。
sep:用来分隔文件路径名的字符串(linux下为'/')。
pathsep:用于分隔文件路径的字符串(linux下为':')。
curdir:当前工作目录的字符串名称。
pardir:当前工作目录的父目录字符串名称。
3、文件内建属性
closed:True表示文件已经被关闭。
encoding:文件所使用的编码方式。
mode:文件打开时使用的访问模式。
name:文件名。
newlines:行结束符,可能为多个。
softspace:为0表示在输出一数据后,要加上一个空格符,1表示不加。
4、标准文件
类似与C语言,python有三个标准文件,即stdin、stdout、stderr,通过sys模块可访问这三个标准文件。print语句通常是输出到sys.stdout,raw_input()则从sys.stdin接受输入。
提到sys模块,sys.argv属性提供了对命令行参数的访问,类似与C语言main()函数的参数,另外getopt模块和optparse模块也可以处理命令行参数。
5、文件系统
针对不同的操作系统,python提供了对应的模块来访问其文件系统,那么在不同操作系统上访问文件系统是不是要导入不同的模块呢,实际上这是不必的,只需要导入os模块就好了,os模块就好像一个文件系统入口一样,会根据实际情况作出选择。os模块和os.path模块提供了常用的文件操作方法。
**tip:os.path.expanduser('~')提供了对波浪号的支持,用于获取用户目录,即$HOME。
6、相关模块
永久存储模块——
pickle、cPickle、marshal:存储转换。将比基本类型复杂的对象转换为一个二进制数据集合,这样就可以把数据集合保存起来或通过网络发送,然后再重新把数据集合恢复原来的对象格式,这个过程也被称为数据的扁平化。pickle模块常用的是dump()和load()函数,分别用来格式转换、对象取出。
dbhash/bsddb、dbm、gdbm、dumbdbm、ayndbm:提供了python字符串的永久性储存。
shelve:兼具存储转换和永久性储存功能。
其它输入输出模块——
base64:提供二进制字符串和文本字符串间的编码/解码操作。
binascii:提供二进制和ASCII编码的二进制字符串间的编码/解码操作。
bz2:访问BZ2格式的压缩文件。
csv:访问csv文件,逗号分隔文件。
filecmp:用于比较目录和文件。
fileinput:提供多个文本文件的的行迭代器。
getopt/optparse:提供了命令行参数的解析处理。
glob/fnmatch:提供Unix样式的通配符匹配的功能。
gzip/zlib:读写gzip(GNU)文件,压缩需要zlib模块。
shutil:提供高级文件访问功能。
c/StringIO:对字符串对象提供类文件接口。
tarfile:读写TAR归档文件,支持压缩文件。
tmpfile:创建一个临时文件(名)。
uu:格式的编码和解码。
zipfile:用于读取ZIP归档文件的工具。