使用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
相关产品推荐
相关产品推荐

