[英]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.