当我们需要对现有文件进行读取数据并修改文件中的数据时,就需要用到对已有文件进行既读又写的操作。有多种可读且可写的文件打开方式: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()