You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:44:28