2012-03-01 10 views
12

Chcę skompresować duże pliki tekstowe za pomocą Pythona (mówię o plikach> 20 GB). nie jestem jak każdy ekspert więc starałem się zebrać informacje i znalazłem następujące wydaje się działać:Duża kompresja plików z pytonem

import bz2 

with open('bigInputfile.txt', 'rb') as input: 
    with bz2.BZ2File('bigInputfile.txt.bz2', 'wb', compresslevel = 9) as output: 
     while True: 
      block = input.read(900000) 
       if not block: 
        break 
       output.write(block) 

input.close() 
output.close() 

Zastanawiam się, czy ta składnia jest poprawna i czy istnieje sposób, aby zoptymalizować go? Mam wrażenie, że czegoś tutaj brakuje.

Wielkie dzięki.

+2

czym polega problem masz? Czy plik wyjściowy jest prawidłowy? – Daenyth

+1

Dlaczego zdecydowałeś się przeczytać w 900000? – n1r3

+0

Wygląda na to, że nieskompresowany rozmiar odpowiada i format wygląda dobrze. Nie jestem pewny, że wszystko, co koduję, uczy mnie sam python (i ogólnie: IT). Dzięki. Tak, wybieram myślenie o rozmiarze kawałków używanych przez bzip2, myślałem, że lepiej skompresować jedną porcję na raz, źle? – user1242959

Odpowiedz

17

Twój scenariusz wydaje się poprawne, ale może być skrócona:

from shutil import copyfileobj 

with open('bigInputfile.txt', 'rb') as input: 
    with bz2.BZ2File('bigInputfile.txt.bz2', 'wb', compresslevel=9) as output: 
     copyfileobj(input, output) 
+0

Dziękujemy! Masz na myśli, że definicja wielkości porcji nie jest wtedy potrzebna? – user1242959

+1

Tak. 'copyfileobj' domyślnie kopiuje w blokach po 16 KB; nadal możesz ustawić rozmiar porcji, jeśli chcesz, dodając trzeci argument. –

+0

Tak, ale to działa dobrze! – user1242959

0

Dlaczego wywołujesz metody .close()? Nie są potrzebne, gdy używasz instrukcji with:.

+0

Nie wiedziałem dzięki! – user1242959

+0

explicit jest lepsze niż niejawne: http://www.python.org/dev/peps/pep-0020/ –