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

使用a+模式操作文件时readlines输出不符合预期的原因

文件写入后readlines未读取到新内容的原因

问题背景

初始有一个名为new_file的文本文件,内容为:

1
2
3
4
5

执行如下Python程序:

f = open('new_file', 'a+')

f.write('\n'.join(str(i) for i in range(1, 6)))
f.seek(0)

print(f.readlines())

f.seek(0)
f.write("\nFinal Line")

print(f.readlines())

f.close()

预期输出

['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5']
['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5\n', 'Final line']

实际输出

['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5']
['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5']

文件最终修改结果符合预期,但第二次readlines()并未读取到新增的Final Line,原因如下:

原因分析

  • 核心问题在于文件缓冲区的同步机制:Python的文件对象会把写入的数据先暂存到内存缓冲区,而非立刻写入磁盘——这是为了减少磁盘IO次数、提升读写效率。
  • 当执行f.write("\nFinal Line")后,这段内容仅存于内存缓冲区,还未同步到磁盘文件。此时调用f.seek(0)再执行readlines(),读取的是磁盘上的旧文件内容,自然看不到新增的行。
  • 只有调用f.flush()强制刷新缓冲区,或者执行f.close()(关闭文件时会自动触发缓冲区刷新)时,缓冲区里的内容才会写入磁盘。所以程序结束后文件内容是正确的,但第二次读取操作发生在缓冲区同步之前,因此读不到新内容。

解决办法

如果要在第二次读取时就能获取到新内容,只需在第二次write后、seek前添加f.flush()强制同步缓冲区:

f.seek(0)
f.write("\nFinal Line")
f.flush()  # 强制将缓冲区内容写入磁盘
f.seek(0)
print(f.readlines())

更推荐使用with语句管理文件上下文,它会自动处理缓冲区刷新和文件关闭,避免这类问题:

with open('new_file', 'a+') as f:
    f.write('\n'.join(str(i) for i in range(1, 6)))
    f.seek(0)
    print(f.readlines())

    f.seek(0)
    f.write("\nFinal Line")
    f.seek(0)
    print(f.readlines())

内容的提问来源于stack exchange,提问作者Rajdeep Sindhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:30:57