簡體   English   中英

文件不寫入當前文件位置

[英]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應該/可能使用用戶已知的位置而不是底層無緩沖文件的內部系統位置。

這在只讀或只寫流上不是問題,但在這個有趣的情況下這是一個問題。

所以現在你知道了:在readwritewriteread ,即使你認為文件的位置是正確的,也總是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM