Python中write()后调用readline()为何写入至文件末尾而非读取位置?
Python r+模式下读写交替导致写入位置异常的原因
现象说明
仅写入的正常情况
用r+模式打开文件后直接执行写入,会覆盖文件开头的字符,这符合r+模式的预期行为:
with open("testfile", "r+") as my_file: my_file.write("========")
测试文件原内容:
first line second line third line fourth line
执行后文件开头的first li会被========覆盖,结果为:
========ne second line third line fourth line
读写交替的异常情况
但如果在write()之后调用readline()(或其他读取方法),会发现写入的内容并没有覆盖开头,而是被追加到了文件末尾:
with open("testfile", "r+") as my_file: my_file.write("========") print(my_file.readline())
原因解析
这种差异源于文件读写切换时的指针规则和缓冲区机制:
- 仅执行写入操作时,文件指针初始在开头,写入操作直接从该位置开始覆盖内容,写入完成后指针停在写入内容的末尾。此时没有后续操作,缓冲区会在文件关闭时自动刷新到磁盘,修改自然作用在开头。
- 当写入后立即执行读取时,Python会先强制刷新输出缓冲区(把内存里待写入的内容同步到磁盘)。而根据底层操作系统的文件规范(比如POSIX标准),在
r+这种读写混合模式下,从写操作切换到读操作时,如果没有先通过seek()显式指定指针位置,系统会自动把文件指针移动到文件末尾。这就导致原本应该写入开头的内容,最终被写到了文件末尾。
本质上是读写交替时未显式定位指针,触发了系统的指针自动同步规则,改变了写入的实际位置。
内容的提问来源于stack exchange,提问作者Code.Kraft
相关产品推荐
相关产品推荐

