簡體   English   中英

Python在任意位置就地寫入文件

[英]Python in-place write to file at arbitrary position

我正在嘗試在python中就地編輯文本文件。 它非常大(因此無法將其加載到內存中)。 我打算替換我在其中找到的逐字節字符串。

with f as open("filename.txt", "r+b"):
    if f.read(8) == "01234567":
        f.seek(-8, 1)
        f.write("87654321")

但是,當我嘗試寫()操作時,它會添加到文件的末尾:

>>> n.read()
'sdf'
>>> n.read(1)
''
>>> n.seek(0,0)
>>> n.read(1)
's'
>>> n.read(1)
'd'
>>> n.write("sdf")
>>> n.read(1)
''
>>> n.seek(0,0)
>>> n.read()
'sdfsdf'
`

我想要的結果是sdsdf

當將讀寫模式流從讀取模式切換到寫入模式時,原始的ANSI / ISO C標准要求進行查找操作,反之亦然。 此限制仍然存在,例如, n1570包含以下文本:

當使用更新模式打開文件時(上面的模式參數值列表中的第二個或第三個字符'+' ),可以在關聯的流上執行輸入和輸出。 但是,在沒有中間調用fflush函數或文件定位函數( fseekfsetposrewind )的情況下,輸出后不能直接輸入,在沒有中間調用文件位置的情況下,輸入后不能直接輸出函數,除非輸入操作遇到文件結尾。 在某些實現中,以更新模式打開(或創建)文本文件可能會打開(或創建)二進制流。

無論出於何種原因,此限制都已導入到Python 1中,即使Python包裝器有可能自動處理它。

值得一提的是,最初的ANSI C限制的原因是在許多基於Unix的系統上發現的低預算實現:它們為每個流保留“當前字節數”和“當前指針”。 如果必須將宏化的getcputc操作調用到基礎實現中,則當前字節數為0,該操作可以檢查是否在更新模式下打開了流並根據需要對其進行了切換。 但是,一旦成功獲得一個字符,計數器將保存可以繼續從基礎流中讀取的字符數。 一旦成功寫入一個字符,計數器將保存允許添加字符的緩沖區位置數。

這意味着,如果你做一個成功getc通過填充內部緩沖器,但跟着它putc ,從“寫”字putc只會覆蓋緩沖數據。 如果您有成功的putc但后面執行不完善的getc ,則會在緩沖區外看到未設置的值。

這個問題很難解決(只需提供單獨的輸入和輸出計數器,其中一個始終為零,並具有實現模式切換的緩沖區重新填充檢查的功能)。


1需要引文:-)

您可以檢查以下代碼的區別:

>>> f = open("file.txt", "r+b")
>>> f.seek(2)
>>> f.write("sdf")
>>> f.seek(0)
>>> f.read()
'sdsdf'


>>> f = open("file.txt", "r+b")
>>> f.read(1)
's'
>>> f.read(1)
'd'
>>> f.write("sdf")
>>> f.seek(0)
>>> f.read()
'sdfsdf'

.write的指針最初位於文件的末尾。 只有.seek()會更改其位置,而不會更改.read()。 因此,您必須在寫入字節之前調用.seek()。 以下代碼運行良好:

>>> f = open("file.txt", "r+b")
>>> f.read(1)
's'
>>> f.read(1)
'd'
>>> f.seek(2)
>>> f.write("sdf")
>>> f.seek(0)
>>> f.read()
'sdsdf'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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