2011-06-19 9 views
6

大きなファイル(数GB)があります。大きなファイルに文字列を挿入

例えば、それは次のテキストを持っている:

Hello, World! 

を私は5位に単語「面白い」を挿入し、残りのテキストをオフセットする必要があります:私はドンすることができますどのように

Hello, funny World! 

」残りを相殺するためにすべてのファイルを読む?または、この操作をどのように最適化できますか?

ありがとうございました。

+0

私はあなたがポジション6(ゼロベース)を意味すると仮定します。 – tzot

+0

Hmm。たぶんあなたは大丈夫です:) –

答えて

8

できません。プレーンテキストファイルは、ファイルの最初または途中で縮小することはできませんが、末尾にのみ縮小します。

+0

バイナリファイルはどうですか? –

+0

@Rulexec:同じです。これは、一般的に使用されているファイルシステムの制限です。 –

+0

正確な形式によって異なります。 –

1

さてあなたはカント、あなたのファイルが数ギガバイトの場合は、おそらく私の解決策は唯一の64ビットのオペレーティングシステムに適用されます詳細は How do I modify a text file in Python?

0

のためにこれを参照してください。

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。

関連する問題