Python中使用r+模式操作文件时写入位置不符合预期的问题
Python中使用r+模式操作文件时写入位置不符合预期的问题
嘿,我来帮你把这个问题掰扯清楚,你遇到的情况其实是Python文本模式下r+操作的一个常见“坑”,不少刚玩文件操作的同学都会栽在这里~
首先咱们先把核心规则说透:在默认的文本模式(不带b参数)下,r+是读写双模式,但如果你先做读取操作,再直接执行写入,写入的位置并不是你读取后指针停留的位置,而是整个文件的末尾——这就是你看到最终文件是原内容Hello, world后面直接加了wow!,而不是你预想的Helwow!world的根本原因。
接下来咱们对着你的测试结果一步步拆解:
- 你的初始文件内容是
Hello, world,用len("Hello, world")算一下,刚好是12个字符,所以文件初始长度是12字节。 - 打开文件后第一个
tell()返回0,这很正常,初始指针就在文件开头。 - 读取3个字符后
tell()返回3,这时候指针确实停在第3个字符的位置(也就是读完Hel之后的位置)。 - 但当你执行
write("wow!")时,Python会自动把指针跳转到文件的末尾(也就是位置12),然后再写入4个字符,所以写入后的tell()返回12+4=16,和你看到的输出完全对上了。
那为啥会有这种“反直觉”的行为?其实这是文本模式下的文件缓冲机制和POSIX系统文件操作逻辑共同导致的:在文本模式下读取后,Python会默认避免你不小心覆盖文件中还没读取到的内容,所以会自动把指针移到文件末尾再执行写入。不过你完全可以自己掌控写入位置——只要在写入前显式调用seek()指定指针位置就行。
比如你把代码改成这样,就能得到你最初预想的结果:
with open("test.txt", "r+") as f: print(f.read(3)) f.seek(3) # 显式把指针定位到读取后的位置 f.write("wow!")
这时候文件内容就会变成Helwow!o, world,也就是从位置3开始覆盖内容,而不是追加到末尾。
最后再给你划个重点:用r+模式操作文件时,先读再写的场景下,一定要记得用seek()显式指定写入位置,不然Python就会默认把内容追加到文件末尾哦。
备注:内容来源于stack exchange,提问作者Binary
相关产品推荐
相关产品推荐

