2011-06-19 57 views
6

我有大文件(幾GB)文本。大文件中的字符串插入

例如,它旁邊的文字:

Hello, World! 

我需要在5位置插入單詞「滑稽」,並抵消其他文本:

Hello, funny World! 

我怎麼能穿上」讀取所有文件的抵消休息?或者我可以如何優化這個操作?

謝謝。

+0

我假設你的意思是位置6(從零開始)。 – tzot

+0

嗯。也許你還好吧:) –

回答

8

你不行。純文本文件不能在文件的開始或中間收縮或擴展,但只能在最後。

+0

二進制文件怎麼樣? –

+0

@Rulexec:同樣的。這是通常使用的文件系統的限制。 –

+0

取決於確切的格式。 –

0

如果你的文件是幾個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程序。因人而異。