我有大文件(幾GB)文本。大文件中的字符串插入
例如,它旁邊的文字:
Hello, World!
我需要在5位置插入單詞「滑稽」,並抵消其他文本:
Hello, funny World!
我怎麼能穿上」讀取所有文件的抵消休息?或者我可以如何優化這個操作?
謝謝。
我有大文件(幾GB)文本。大文件中的字符串插入
例如,它旁邊的文字:
Hello, World!
我需要在5位置插入單詞「滑稽」,並抵消其他文本:
Hello, funny World!
我怎麼能穿上」讀取所有文件的抵消休息?或者我可以如何優化這個操作?
謝謝。
你不行。純文本文件不能在文件的開始或中間收縮或擴展,但只能在最後。
二進制文件怎麼樣? –
@Rulexec:同樣的。這是通常使用的文件系統的限制。 –
取決於確切的格式。 –
那麼你不能,請參閱本作的詳細信息 How do I modify a text file in Python?
如果你的文件是幾個G,那麼很可能我的解決方案將只適用於64位操作系統:
from __future__ import with_statement
import mmap, os
def insert_string(fp, offset, some_bytes):
# fp is assumedly open for read and write
fp.seek(0, os.SEEK_END)
# now append len(some_bytes) dummy bytes
fp.write(some_bytes) # some_bytes happens to have the right len :)
fp.flush()
file_length= fp.tell()
mm= mmap.mmap(fp.fileno(), file_length)
# how many bytes do we have to shift?
bytes_to_shift= file_length - offset - len(some_bytes)
# now shift them
mm.move(offset + len(some_bytes), offset, bytes_to_shift)
# and replace the contents at offset
mm[offset:offset+len(some_bytes)]= some_bytes
mm.close()
if __name__ == "__main__":
# create the sample file
with open("test.txt", "w") as fp:
fp.write("Hello, World!")
# now operate on it
with open("test.txt", "r+b") as fp:
insert_string(fp, 6, " funny")
NB :這是一個Linux上的Python 2程序。因人而異。
我假設你的意思是位置6(從零開始)。 – tzot
嗯。也許你還好吧:) –