关于Python中r+模式下文件读写后指针行为的疑问
关于Python中r+模式下文件读写后指针行为的疑问
问题背景
用户执行的代码如下:
f=open("hello.txt","r+") f.read(5) f.write("op") f.close()
初始文本文件hello.txt的内容是:
python my world heellll mine
用户原本预期执行后文件内容会变成:pythoopmy world heellll mine,但实际运行后结果是:python my world heellll mineop,因此产生疑问。
原因解释
咱们先把关键概念用大白话讲清楚,再一步步拆解你的操作:
- 文件指针:就像你用编辑器打开文件时的光标,它指着当前要读或者写的位置。
r+模式:这个模式确实允许同时读和写,但有个容易踩坑的规则:如果读完之后直接写,Python会自动把光标跳到文件末尾再写,而不是停留在你读完的位置覆盖内容——除非你手动把光标挪回去。
现在看你的操作流程:
- 打开文件时,光标在最开头(位置0)。
f.read(5)读了前5个字符pytho,这时候光标移到了第5个字符后面,也就是原内容里n的前面(位置5)。- 这时候你直接执行
f.write("op")——重点来了!在r+模式下,读完就写的话,Python会默认把光标直接跳到文件最后,把op追加在末尾,而不是在位置5覆盖原有的n。 - 所以最终结果就是原内容后面多了
op,变成了python my world heellll mineop。
如果想实现你预期的覆盖效果,其实很简单,读完之后手动把光标移回你要覆盖的位置就行,用f.seek()方法指定位置。修改后的代码如下:
f=open("hello.txt","r+") f.read(5) f.seek(5) # 手动把光标挪回位置5 f.write("op") f.close()
这样执行后,就会把位置5开始的字符替换成op,得到你想要的pythoopmy world heellll mine。
补充说明
这个规则其实源于操作系统层面的文件处理逻辑,r+模式下默认读完就写的行为是追加到末尾,目的是避免误覆盖文件中间的内容,如果你需要覆盖特定位置,就得主动调整指针位置。
备注:内容来源于stack exchange,提问作者om bahetra
相关产品推荐
相关产品推荐

