文章目录
1、w+模式:在w模式的基础上增加可读功能。
可读可写模式打开文本,文件不存在时新建,文件有内容时以写入的内容覆盖。
a.写入内容
with open('write_plus.txt','w+') as f:
f.write('hi,I am write plus1')
相应目录下生成’write_plus.txt’
文档内容:
hi,I am write plus1
b.内容覆盖
with open('write_plus.txt','w+') as f:
f.write('hi,I am write plus2')
文档内容:
hi,I am write plus2
上述两个步骤搜这只用到写的功能,因此与w模式无异。但是w模式不能执行读取操作,不能read。
c.读取内容
with open('write_plus.txt','w+') as f:
print(f.read())
'w+'模式打开后,内容清空,没有内容可读。
d.先写后读—只能写,不能读
with open('write_plus.txt','w+') as f:#清空文档
f.write('hi,I am write plus3')
print(f.read())#没有内容可读
没有输出
文档内容:
hi,I am write plus3
如结果所示,上述语句并没有将写入的内容读取出来,甚至没有将之前已经存在的内容读取出来,没有任何返回。原因是当执行到open语句识别到‘w+’的时候,文档已经被清空了,即使执行到write语句,还没有close的情况下,要写的内容还没有被写入,这时可以读取的内容就是空。
因此在写入后直接读取内容是不可行的。
e.先读后写—之前的内容无可读,只能写入之后的内容
with open('write_plus.txt','w+') as f:
str_file=f.read()+' I am write plus 4'#这一步已经没有内容可读了
f.write(str_file)
文档内容:
,and I am write plus 4
设想先读取内容,再把读取的内容写入是什么结果呢?如上所示,当以w+模式打开的时候,f.read()已经是空了,无法保留原文档的内容。
先写后读需要分步以非w模式先读,再写入。
总结: w+模式只是在w模式的基础上增加可读功能,read不报错,但实际用该模式打开时,内容已经清空了。
2、r+模式:在r模式的基础上增加可写功能。
可读可写模式打开文本,文件不存在时报错,文件有内容时以写入的内容覆盖。
a.写入内容
with open('read_plus.txt','r+') as f:
f.write('hi,I am read plus1')
文档内容:
hi,I am read plus1
b.覆盖内容
with open('read_plus.txt','r+') as f:
f.write('hi,I am read plus2')
文档内容:
hi,I am read plus2
前两种方式,除了无法新建未存在文档,其他与w模式相同。
c.读取内容
with open('read_plus.txt','r+') as f:
print(f.read())
hi,I am read plus3
文档可以被读取,如同’r’模式
d.先写后读—不能实现一步到位
with open('read_plus.txt','r+') as f:
f.write('hi,I am read plus3')
f.read()
文档内容:
hi,I am read plus3
在写的时候,由于文档并未被读取,文档将从头写入,未close情况下,写入的内容没有保存到文档,因此无可读。
实际上,'r+'模式的确可以读取内容,只是在read步骤之前如果有write就没有读取
e.先读后写—可以实现
with open('read_plus.txt','r+') as f:
new_str=f.read().upper()
print(new_str)
f.write(new_str)
HI,I AM READ PLUS3
文档内容:
hi,I am read plus3HI,I AM READ PLUS3
文档打开后,内容是可以被读出来的,在文档读至结尾的的地方,才将新内容写入,因此可以看到先读后写,可以保留已读取的内容,这样类似“追加”模式。
思考:是否可以将读取的内容从头写入?
如果要从头写入,那么就需要定位到开头位置,可以使用seek()方法,读取到数据后,先定位到开头,清空内容后truncate,再write
#恢复到“先写后读”完成后的步骤
with open('read_plus.txt','r+') as f:
new_str=f.read().upper()
f.seek(0)#定位到开头
f.truncate()
f.write(new_str)
文档内容:
I AM READ PLUS3
这样,就用读取并加工后的内容覆盖了原来的内容,实现了打开一次文件实现将读取的内容重新写入的功能。
3、a+模式:在a模式的基础上增加可读功能。
可读可写模式打开文本,文件不存在时新建,文件有内容时以写入的内容在文档后面追加。
a.写入内容
with open('append_plus.txt','r+') as f:
f.write('hi,I am append plus1')
文档内容:
hi,I am append plus1
b.追加内容
with open('read_plus.txt','r+') as f:
f.write('hi,I am read plus2')
文档内容:
hi,I am append plus1hi,I am append plus2
前两种操作,同‘a’模式
c.读取内容
事实上,‘a+’模式也无法读取内容,只不过在read的时候不报错:
with open('append_plus.txt','a+') as f:
print(f.read())
d.先写后读—不能实现
with open('append_plus.txt','a+') as f:
f.write('hi,I am append plus3')
print(f.read())
文档内容:
hi,I am append plus1hi,I am append plus2hi,I am append plus3
没有读取内容,只不过执行了一个追加的操作。
e.先读后写—不能实现
with open('append_plus.txt','a+') as f:
new_str=f.read().upper()+',and I am write plus 4'#f.read()是空的
print(new_str)
f.write(new_str)
HI,I AM READ PLUS3
文档内容:
hi,I am append plus1hi,I am append plus2hi,I am append plus3,and I am write plus 4
有次可以看出,由于‘a+’模式并不能真的读到内容,因此只能进行追加操作。
总结:'a+'模式只不过在‘a’模式上增加read不报错属性,并不能真的读取内容,从而也不能将读取的内容再写入。
三种模式对比:
模式 | 文件不存在 | 再次写入 | 读取文件 | 将原内容读写 |
---|---|---|---|---|
w+ | 新建 | 覆盖 | 打开后无内容 | 不可行 |
r+ | 报错 | 覆盖 | 打开后即读有内容 打开后先写后读无内容 | 可行,结合seek 不可行 |
a+ | 新建 | 追加 | 打开后无内容 | 不可行 |
参考文档:https://blog.csdn.net/weixin_40844116/article/details/84948081