关于下面的两个交互,我希望两者都输出相同的文件,但是第二个在文件末尾写入。唯一的区别是写入后的读取语句,我不知道发生了什么。我想念什么?
预期行为:
>>> f = open("test.txt","w+")
>>> f.write('0123456789')
10
>>> f.seek(0)
0
>>> f.read(3)
'012'
>>> f.seek(0,1)
3
>>> f.write('XX')
2
>>> f.seek(0)
0
>>> f.read()
'012XX56789'
>>> f.close()
异常行为:
>>> f = open("test.txt","w+")
>>> f.write('0123456789')
10
>>> f.seek(0)
0
>>> f.read(3)
'012'
>>> f.seek(0,1)
3
>>> f.write('XX')
2
>>> f.read(2)
'34'
>>> f.seek(0)
0
>>> f.read()
'0123456789XX'
>>> f.close()
您可以看到XX
是在整行之后写的,而我在写这些字符时处于位置3。
答案 0 :(得分:3)
发生的事情是write
已被缓冲,并且中间的read
在提交(取消)写入之前将基础文件位置提升到文件的末尾(因为它很小)。如果写操作之后是seek
,则在实际查找之前将写缓冲区提交到正确的位置。这种方法避免了每次读取以检查挂起的写入的开销,并且长期以来一直specified by POSIX。