2012-07-14 16 views
16

Próbuję użyć modułu zipfile, aby odczytać plik z archiwum. nieskompresowany plik ma rozmiar ~ 3 GB, a skompresowany plik to 200 MB. Nie chcę ich w pamięci podczas przetwarzania skompresowanego pliku wiersz po linii. Do tej pory zauważyłem nadużywanie pamięci za pomocą następującego kodu:Przeczytaj duży spakowany plik tekstowy wiersz po wierszu w pytonie

import zipfile 
f = open(...) 
z = zipfile.ZipFile(f) 
for line in zipfile.open(...).readlines() 
    print line 

Zrobiłem to w C# za pomocą SharpZipLib:

var fStream = File.OpenRead("..."); 
var unzipper = new ICSharpCode.SharpZipLib.Zip.ZipFile(fStream); 
var dataStream = unzipper.GetInputStream(0); 

strumienia danych jest nieskompresowany. Nie mogę znaleźć sposobu, aby to zrobić w Pythonie. Pomoc zostanie doceniona.

Odpowiedz

38

Obiekty plików Pythona zawierają iteratory, które będą czytać wiersz po wierszu. file.readlines() czyta je wszystkie i zwraca listę - co oznacza, że ​​musi wszystko przeczytać w pamięci. Lepszym rozwiązaniem (które zawsze powinny być preferowane nad readlines()) jest po prostu pętli nad samym obiekcie, Eg:

import zipfile 
with zipfile.ZipFile(...) as z: 
    with z.open(...) as f: 
     for line in f: 
      print line 

Uwaga moje użycie the with statement - obiekty plików są menedżerowie kontekście oraz z oświadczeniem pozwala nam łatwo napisać czytelny kod, który zapewnia, że ​​pliki są zamykane po zamknięciu bloku (nawet po wyjątkach). To znowu powinno być zawsze używane podczas pracy z plikami.

+0

nie można powiedzieć nic lepszego –

Powiązane problemy