Python的文件处理和相关输入输出能力。介绍文件对象(它的内建函数,内建方法和属性),标准文件,同时讨论文件系统的访问方法,文件执行,以及相关文件模块。

一,内建函数open()和file()

语法:

file_object = open(fiel_name, access_mode=’r’, buffering=-1)

File_name是要打开的文件名字的字符串,可以使相对路径或者绝对路径,access_mode可选参数,表示文件打开的模式,’r’,’w’,’a’ 分别代表读取,写入和追加。还有个’U’模式,代表通用换行符支持。


‘r’或者’U’模式打开的文件必须是已经存在的,使用’w’模式打开的文件若存在则首先清空,然后重新创建。以’a’模式打开的文件是为追加数据准备的,所有写入数据都将追加到文件的末尾。

另一个可选参数buffering用于指示访问文件所采用的缓冲方式,0表示不缓冲,1表示缓冲一行数据,大于1代表用给定值作为缓冲区大小,不提供参数或者负值代表使用系统默认缓冲机制。


File()和open()的用法相同。

1 f = open(`foo`) # 以读取模式打开 `foo`
 2 f = open(`foo`,`w`) # 以写模式打开 `foo`

文件模式 `r` 表示读, `w` 表示写, `a` 表示在文件末尾添加内容。 模式字符后面允许跟一个 `b` 表示访问的是二进制数据,比如 `rb` 或 `wb`。对 UNIX(或Linux)这个`b`有没有无关紧要,对 Windows 平台则有积极意义。如果你很关心代码的可移植性,那就最好总是加上这个`b`。另外,还有一种更新模式,你只要在读写模式后增加一个`+`就可以使用这种模式,如`r+` 或 `w+`。当一个文件以更新模式打开,你就可以对这个文件进行读写操作。只要在任何读取操作之前刷新所有的输出缓冲就不会有问题。如果一个文件以 `w+` 模式打开,它的长度就度截为 0。

open() 返回一个文件对象,它支持下表中列出的方法

表 9.1. 文件方法

方法 描述

f.read([n]) 读取至多 n 字节
 f.readline([n]) 读取一行中的前 n 字符。如果 n 被省略,就读取整行
 f.readlines() 读取所有的行并返回一个包含所有行的列表
 f.xreadlines() 返回一个迭代器,每次迭代返回文件的一个新行
 f.write(s) 将字符串 s 写入文件
 f.writelines(l) 将列表 l 中的所有字符串写入文件
 f.close() 结束文件
 f.tell() 返回当前的文件指针
 f.seek(offset [, where]) 定位到一个新的文件位置
 f.isatty() 如果 f 是一个交互式终端则返回 1
 f.flush() 刷新输出缓冲区
 f.truncate([size]) 如果文件长于 size 就截短它至 size 大小
 f.fileno() 返回一个整型的文件描述符
 f.readinto(buffer ,nbytes)读取 n 字节数据至一个 buffer 对象。


除非给 read() 方法一个可选的长度参数,它就会读取整个文件并将文件内容作为一个字符串返回。 readline() 返回下一行,包含换行字符。如果在调用 readline() 方法时提供一个长度参数 n,若 n 大于该行长度,则返回前 n 个字节。该行剩下的部分并不会被丢弃,在下次读取操作时会被返回。 readlines() 方法读取所有行,并将这些行作为一个 list 返回。readline() 和 readlines() 会自动处理换行在不同平台的表示。(众所周知的 `\n`,`\r`,`\r\n`) xreadlines() 返回一个迭代器,允许用迭代的方式得到文件的每一行。下面是一个使用 xreadlines()的例子:

Toggle line numbersToggle line numbers
1 for line in f.xreadlines():
 2 # Do something with line
 3 ...


write() 方法将一个字符串写入文件。 writelines() 将一个字符串列表中的所有元素顺序写入文件。以上所有操作,字符串中均可包含二进制数据。 seek(offset[,where])用来随机存取文件的任一部分。offset是偏移量,where是可选的位置参数(默认值为0,表示文件开始位置)。 如果where的值是1,表示当前位置。如果where是2表示文件结束位置。fileno()返回一个打开文件的整型文件描述编号,有些模块在进行低层次 I/O操作时会用到。在支持单个文件超过2GB容量的机器上,seek() 和 tell() 使用长整数. 不过要允许这个特性可能需要重新配置并重新编译Python解释器。

文件对象还有下面的数据属性:

属性 描述 f.closed 表示文件状态的布尔值: 0 表示文件打开, 1 表示已关闭。 f.mode 文件打开模式 f.name open()函数打开的文件名 否则,它就是一个表示文件来源的字符串 f.softspace 这是一个布尔值 在使用 print 语句时表示在打印另一个值之前,是否要先打印一个空白符。若用类来模仿文件操作则必须提供这样一个可写的属性,并将其初始化为0。


二,文件内建方法:
 

1 输入

read()方法用来直接读取字节到字符串中,可以指定读取数目,默认是文件将被读取直至末尾。

readline()读取打开文件的一行,包括行结束符,也可选size参数,默认为-1,代表直至读到行结束符。

readlines()不和前两个一个返回一个字符串,它会读取所有行然后把它们作为一个字符串列表返回,有一个可选参数sizhint代表返回的最大字节大小。

2 输出

write()内建方法功能与read()和readline()相反,它把含有文本数据或二进制数据块的字符写到文件中去。

和readlines()一样,writelines()方法是针对列表的操作,它接受一个字符串列表作为参数,将它写入文件,行结束符不会自动加入,所以如果需要的话,你必须在调用writelines()前给每行结尾加上行结束符。

3 文件内移动 seek()

seek()方法可以在文件中移动文件指针到不同的位置,offset字节代表对于某个位置偏移量,位置的默认值为0,代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起。和C语言总的fseek()类似。


下面看看几个例子:

filename = raw_input('Enter file name: ')
f = open(filename,'r')
allLines = f.readlines()
f.close()
for eachLine in allLines:
print eachLine,

这个例子是读取一个文件的内容,但是是先把文件的所有内容读到allLines后,在把它一行一行的通过for循环打印出来。

下面看看用文件迭代器的方法:

filename = raw_input('Enter file name: ')
f = open(filename,'r')
for eachLine in f:
print eachLine,
f.close()

这个思路是读一行显示一行,

注意:print语句默认在输出内容末尾加一个换行符,在其后面加一个逗号就可以避免这个行为,readline()和readlines()不会对行里的空白字符做任何处理,如果我们不加逗号的话,那么显示的文本每行后都会有两个换行符,一个是附带的,另一个是print语句自动添加的。


下面看两个例子:

第一个:

import os
filename = raw_input('Enter file name:')
fobj = open(filename,'w')
while True:
aLine = raw_input("Enter a line('.' to quit):")
if aLine !=".":
fobj.write('%s%s' % (aLine,os.linesep))
else:
break
fobj.close()


第二个例子:以可读可写模式创建一个新的文件,在向文件写入数据后,我们使用seek()方法在文件内部移动,使用tell()方法展示我们的移动过程。

>>> f = open('c:/Python26/code/test.txt','w+')
>>> f.tell()
0L
>>> f.write('test line 1\n')
>>> f.tell()
13L
>>> f.write('test line 2\n')
>>> f.tell()
26L
>>> f.seek(-13,1)
>>> f.tell()
13L
>>> f.readline()
'test line 2\n'
>>> f.seek(0,0)
>>> f.readline()
'test line 1\n'
>>> f.tell()
13L
>>> f.readline()
'test line 2\n'
>>> f.tell()
26L
>>> f.close()
>>>