当我们需要对现有文件进行读取数据并修改文件中的数据时,就需要用到对已有文件进行既读又写的操作。有多种可读且可写的文件打开方式:r+,w+,a+,rb+,wb+,ab+,具体含义见下表。
打开 方式 | 读写 特性 | 文件数据 特性 | 对文件存在性的处理方式 | 备注 | |
文件已存在 | 文件不存在 | ||||
r | 只读 | 文本文件 | 必须已存在 | 打开失败 |
|
w | 只写 | 文本文件 | 覆盖原文件 | 创建新文件 |
|
a | 只写 | 文本文件 | 不覆盖原文件 | 创建新文件 | 在文件末尾追加写数据。 |
rb | 只读 | 二进制文件 | 必须已存在 | 打开失败 |
|
wb | 只写 | 二进制文件 | 覆盖原文件 | 创建新文件 |
|
ab | 只写 | 二进制文件 | 不覆盖原文件 | 创建新文件 | 在文件末尾追加写数据。 |
r+ | 读写 | 文本文件 | 必须已存在 | 打开失败 |
|
w+ | 读写 | 文本文件 | 覆盖原文件 | 创建新文件 |
|
a+ | 读写 | 文本文件 | 不覆盖原文件 | 创建新文件 | 在文件末尾追加写数据。 |
rb+ | 读写 | 二进制文件 | 必须已存在 | 打开失败 |
|
wb+ | 读写 | 二进制文件 | 覆盖原文件 | 创建新文件 |
|
ab+ | 读写 | 二进制文件 | 不覆盖原文件 | 创建新文件 | 在文件末尾追加写数据。 |
(上表中的读写方式助记:r--read,读, w--write,写, a--append或attach,追加, b--binary,二进制)
在此强调的是在对打开的同一个文件进行即读又写操作时,关于文件读写位置需要注意的事项。
下面以用r+方式打开的读写已经存在的文本文件为例。需要注意一点的是,读操作和写操作是共用一个文件位置指示的。也就是说文件操作没有分别指示读位置和写位置指示的,只有一个文件位置指示。因此,如果读操作和写操作交替进行,那么,上次的读操作结束时所在的读写位置,默认就是下次写操作时的文件读写位置的开始,相应地,上次的写操作结束的位置,默认就是下次读操作开始的位置。如果这种默认文件读写位置不能满足你的实际需要的话,必须用所操作文件对象的see(offset,whence)方法,将文件读写位置按自己的需要进行定位,此函数参数offset为偏移量,可正负,参数whence表示offset相对的基准位置,取值0,1,-1,分别表示文件开头,当前位置和文件末尾。
实例,将数独游戏数据文件中一行的81个数字,修改成9行,每行9个数字。
程序如下:
fObj = open(fileName, 'r+')
lines = fObj.readlines()
fObj.seek(0,0)
for aLine in lines:
fObj.write(aLine)
fObj.write('\n')
fObj.close()