[英]file not write in current file position
with open('test.txt', 'w+') as f:
f.write('foo')
f.seek(0)
f.read(1)
print f.tell() # 1
f.write('bar')
我希望结果是fbar
但它返回foobar
。 显然,文件不会写入当前文件位置。
with open('test.txt', 'w+') as f:
f.write('foo')
f.seek(0)
f.read(1)
m = f.tell() # 1
f.seek(m)
f.write('bar')
它像我期望的那样工作。
为什么我需要在当前文件位置已经为1
再次seek
?
这是因为open
返回一个缓冲的文件对象。
当你正在阅读时,它会因为缓冲而读取幕后的所有文件(因为从磁盘读取char是低效的)。
f.tell()
与你读过的内容是一致的,但是在你内部编写时,文件指针在其他地方,这就是你必须通过强制seek
来解决它的原因。
这只是“为什么?”,但恕我直言,这是一个错误(或限制),因为write
应该/可能使用用户已知的位置而不是底层无缓冲文件的内部系统位置。
这在只读或只写流上不是问题,但在这个有趣的情况下这是一个问题。
所以现在你知道了:在read
后write
或write
后read
,即使你认为文件的位置是正确的,也总是使用seek
。
作为替代方案,您可以使用os.open
来确保不涉及缓冲(对于系统调用进行一些调整,因为ftell
不存在,您必须从当前查找0以获取当前位置):
import os
f = os.open('test.txt',os.O_RDWR|os.O_TRUNC)
os.write(f,b'foo') # b prefix needed, stream is binary
os.lseek(f, 0, os.SEEK_SET)
os.read(f,1)
# print(os.lseek(f, 0, os.SEEK_CUR)) # to seek/get current
os.write(f,b'bar')
os.close(f)
在这种情况下,你可以获得fbar
(即使禁用lseek
语句)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.