python关于文件读写的问题。

代码如下:

f = open("file_test", "w+", encoding="utf-8")
f.write("0123456789\n")
f.write("HIJKLMN\n")
f.write("hijklmn\n")
f.seek(0) # 光标移动到0的位置
f.write("test") # 再写入会将原内容覆盖
#print(f.readline()) # 如果这一行注释掉,则“test”会写到文件末尾。否则“test”会写到文件开头。WTF?
f.close()

问题:如果注释掉倒数第二行,“test”会写到文件末尾,否则“test”会写到文件开头。咋回事?

f = open("file_test", "w+", encoding="utf-8")
f.write("0123456789\n")
f.write("HIJKLMN\n")
f.write("hijklmn\n")
f.seek(0) # 光标移动到0的位置
f.write("test") # 再写入会将原内容覆盖
print(f.readlines()) # 如果这一行注释掉,则“test”会写到文件末尾。否则“test”会写到文件开头。WTF?
f.close()

可能是读取的优先级比写的优先级高,读取的时候,全部读取完,光标定位到文件末尾,这时候f.write才可是写入。

谢谢,你的解释works well。这个可能和缓冲区的维护机制有关。如果在写入语句后,添加flush操作,则写操作完成后再执行readlings操作。如果写入语句后没有及时将缓冲区的内容刷新到文件,则读取时,挂起写操作,从文件更新缓冲区并完成读取操作,然后再把未执行的写操作更新到缓冲区,最后写入文件。

补充:另外查了下,python打开文件时,可以指定缓冲行为:
打开文件时参数buffering:
buffering默认为-1,系统默认的全缓冲
buffering可以设置为大于1的任意整数,字节数为buffering的全缓冲
buffering=1,设置为行缓冲模式

buffering=0, 设置为无缓冲模式