2012-05-12 11 views
32

Czy można łatwo odczytać linię ze skompresowanego pliku gz za pomocą Pythona bez całkowitego wyodrębnienia pliku? Mam plik text.gz, który jest aroud 200mb. Po wyodrębnieniu staje się 7,4 gb. I nie jest to jedyny plik, który muszę przeczytać. Dla całego procesu muszę przeczytać 10 plików. Chociaż będzie to praca sekwencyjna, myślę, że będzie to mądrą rzeczą bez pozbawiania całej informacji. Nie wiem nawet, czy to możliwe. Jak to zrobić za pomocą Pythona? Muszę czytać plik tekstowy wiersz po wierszu.python: odczytuje linie ze skompresowanych plików tekstowych

Odpowiedz

38

Można użyć standardowego modułu gzip w python. Po prostu użyj:

gzip.open('myfile.gz') 

, aby otworzyć plik jak każdy inny plik i przeczytać jego wiersze.

Więcej informacji tutaj: Python gzip module

+0

z ciekawości to ładuje cały plik do pamięci? Czy jest wystarczająco inteligentny, aby ładować linie w razie potrzeby? –

+1

@Sachin_ruk nie wczytuje pliku, który właśnie otwiera. Aby faktycznie załadować dane z pliku, musisz wykonać '' 'f.readline()' ', aby odczytywać linię na raz. Lub '' f.readlines (N) '' gdzie '' N'' to liczba linii, które chcesz przeczytać. – Tom

22

Korzystanie gzip.GzipFile:

import gzip 

with gzip.open('input.gz','r') as f: 
    for line in f: 
     print('got line', line) 

Uwaga : dla python3 należy określić plik zostać otwarty w 'rt', jak 'r' domyślnych do odczytu binarnego, lub w przeciwnym razie użyj line.decode(...).

Uwaga : gzip.open(filename, mode) to pseudonim dla gzip.GzipFile(filename, mode). Wolę ten pierwszy, ponieważ wygląda podobnie do with open(...) as f: używany do otwierania nieskompresowanych plików.

+18

Dla python3 musisz określić plik, który ma zostać otwarty w 'rt', ponieważ 'r' domyślnie czyta binarnie. – kap

+1

lub użyj 'line.decode()' – dmeu

Powiązane problemy