python3 open 打开模式详解

偶尔因为课程需要和兴趣,会敲点python代码,经常会接触文件读写,但是一直没有弄明白r+, w+, a+的区别,今天写点脚本又碰到了这个问题,打算实验一下这几个发开模式。

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+则报错。

阅读更多

没有更多推荐了,返回首页