我有一个带文本的大文件(几个GB)。
例如,它有下一个文本:
Hello, World!
我需要在5个位置插入单词"滑稽",并抵消文本的其余部分:
Hello, funny World!
我怎么能不读取所有文件来抵消剩余?或者如何优化此操作?
谢谢。
你不能。纯文本文件不能在文件的开头或中间收缩或展开,只能在末尾收缩或展开。
你不能,请查看此以获取更多信息如何在Python中修改文本文件?
如果你的文件只有几GB,那么我的解决方案可能只适用于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")
注意:这是一个Linux上的Python 2程序。YMMV。