2010-03-02 19 views
9

Powiedzmy, że mam plik binarny o pojemności 12 GB i chcę wyciąć 8GB z jego środka. Znam wskaźniki pozycji, które chcę przeciąć.Python: cięcie bardzo dużego pliku binarnego

Jak to zrobić? Oczywiście 12 GB nie pasuje do pamięci, to dobrze, ale 8 GB też nie ... Co myślałem, było w porządku, ale wydaje się, że binarny nie wydaje się, że to podoba, jeśli robisz to w kawałkach! Dodałem 10 MB do nowego pliku binarnego, a na każdym z plików o rozmiarze 10 MB znajdują się nieciągłości w nowym pliku.

Czy istnieje Pythoniczny sposób robienia tego z łatwością?

Odpowiedz

8

Oto krótki przykład. Dostosować w zależności od potrzeb:

def copypart(src,dest,start,length,bufsize=1024*1024): 
    with open(src,'rb') as f1: 
     f1.seek(start) 
     with open(dest,'wb') as f2: 
      while length: 
       chunk = min(bufsize,length) 
       data = f1.read(chunk) 
       f2.write(data) 
       length -= chunk 

if __name__ == '__main__': 
    GIG = 2**30 
    copypart('test.bin','test2.bin',1*GIG,8*GIG) 
+0

zrobiłem coś bardzo podobnego niż to i nie wydają się podoba, z binarny jeśli wyodrębnić blok danych na środku nie może czasami bałagan na krawędziach ponieważ potrzebuje otaczających bajtów, żeby miały sens? Hmm. Spróbuję twojego kodu, ale okrzyki. Czy dostałeś również swoją długość i buforowanie w złym kierunku w ostatnim wierszu kodu? –

+0

To jest początek i długość ... ostatnia linia używa wartości domyślnej dla bufsize. Nie jestem pewien, co masz na myśli mówiąc "bałagany na krawędziach". Jeśli potrzebujesz otaczających bajtów, może twój początek i długość są nieprawidłowe? –

+0

Masz rację! Sam się popsułem, to wszystko działa teraz :) Jaki jest optymalny rozmiar bufora do transferu plików? 1 MB dobry? –

Powiązane problemy