大きなファイル(数GB)があります。大きなファイルに文字列を挿入
例えば、それは次のテキストを持っている:
Hello, World!
を私は5位に単語「面白い」を挿入し、残りのテキストをオフセットする必要があります:私はドンすることができますどのように
Hello, funny World!
」残りを相殺するためにすべてのファイルを読む?または、この操作をどのように最適化できますか?
ありがとうございました。
大きなファイル(数GB)があります。大きなファイルに文字列を挿入
例えば、それは次のテキストを持っている:
Hello, World!
を私は5位に単語「面白い」を挿入し、残りのテキストをオフセットする必要があります:私はドンすることができますどのように
Hello, funny World!
」残りを相殺するためにすべてのファイルを読む?または、この操作をどのように最適化できますか?
ありがとうございました。
できません。プレーンテキストファイルは、ファイルの最初または途中で縮小することはできませんが、末尾にのみ縮小します。
バイナリファイルはどうですか? –
@Rulexec:同じです。これは、一般的に使用されているファイルシステムの制限です。 –
正確な形式によって異なります。 –
さてあなたはカント、あなたのファイルが数ギガバイトの場合は、おそらく私の解決策は唯一の64ビットのオペレーティングシステムに適用されます詳細は How do I modify a text file in Python?
のためにこれを参照してください。
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プログラムです。 YMMV。
私はあなたがポジション6(ゼロベース)を意味すると仮定します。 – tzot
Hmm。たぶんあなたは大丈夫です:) –