2011-06-19 23 views
6

Mam duży plik (kilka GB) z tekstem.wstawianie napisów w dużym pliku

Na przykład, mieć następny tekst:

Hello, World! 

Muszę wstawić słowo "śmieszny" na 5 pozycji, a przesunięcie resztę tekstu:

Hello, funny World! 

Jak mogę don” t odczytać cały plik dla skompensowania odpoczynku? Albo jak mogę zoptymalizować tę operację?

Dzięki.

+0

Zakładam, że chodziło o pozycję 6 (bazującą na zera). – tzot

+0

Hmm. Może wszystko w porządku :) –

Odpowiedz

8

Nie możesz. Zwykłe pliki tekstowe nie mogą być skrócone ani rozwinięte na początku ani w środku pliku, ale tylko na końcu.

+0

A co z plikami binarnymi? –

+0

@Rulexec: To samo. Jest to ograniczenie ogólnie używanych systemów plików. –

+0

W zależności od dokładnego formatu. –

0

Jeśli plik jest kilka gigabajtów, to prawdopodobnie moje rozwiązanie będzie miało zastosowanie tylko do 64-bitowych systemów operacyjnych:

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 : jest to program Python 2 na Linux. YMMV.

Powiązane problemy