【Python小笔记】读写模式w+、r+、a+实例对比

本文深入探讨了Python中不同文件操作模式的特点,包括w+、r+和a+模式,详细解析了每种模式下读写操作的行为,以及如何利用这些模式进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/weixin_40844116/article/details/84948081

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值