偶尔因为课程需要和兴趣,会敲点python代码,经常会接触文件读写,但是一直没有弄明白r+, w+, a+的区别,今天写点脚本又碰到了这个问题,打算实验一下这几个发开模式。
w 以写方式打开
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
1. 官方文档是说:
r 以读的方式打开w 以写方式打开
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
r, w, a这三个就不实验了,只需要注意如果打开文档不存在,r会报错,w和a则会创建新文档。
2. r+:
txt文本如下(同第3、4小节的原始文本):
在解释器里执行下列语句:首先把工作路径切换到txt文本所在目录,然后打开txt文本
>>> os.chdir('/your/path/') >>> txt = open('t.txt', 'r+') >>> txt.write('hhh') 3 >>> txt.close()
执行结果是:
可以看到写入的'hhh'把原来文本中的'A\nB'这三个字符给覆盖了,写入位置是文本起始处
但是如果进行了读操作,写入就会在文本后面追加,而不是从头覆盖原始内容了,见下图:
>>> txt = open('t.txt', 'r+') >>> txt.readline() 'A\n' >>> txt.write('hhh') 3 >>> txt.close()
执行结果为:
3. w+
w+是打开文件后清空原始内容,对清空后的文本可执行读写操作,读操作需要通过seek()方法将读取指针从末尾移动到前面,才能读取内容(w模式是不能读取的),写操作则是一直追加在文本末尾。
>>> txt = open('t.txt', 'w+') >>> txt.readline() '' >>> txt.write('E\nF\nG\nH') 7 >>> txt.readline() '' >>> txt.seek(0, 0) 0 >>> txt.readline() 'E\n' >>> txt.readline() 'F\n' >>> txt.close()
执行结果是:
4. a+
a+是追加文本在文档末尾,不会覆盖原来的内容,读取时也需要通过seek()方法移动读取指针到文档开头,否则指针在最后面是读取不到内容的。
>>> txt = open('t.txt', 'a+') >>> txt.readline() '' >>> txt.seek(0, 0) 0 >>> txt.readline() 'A\n' >>> txt.write('\nE') 2 >>> txt.close()
执行结果:
5. 小结
看到这里呢,a+和r+的区别也就知道了。r+如果不进行读操作,会从文档起始位置开始写入,并会覆盖原始文本;a+永远是追加在文本在文档最后面。w+则会清空原始文本,清空后就跟a+的行为相同了。a+和w+在打开文件不存在的情况下能创建新文档,而r+则报错。