2012-05-12 9 views
32

Ist es einfach, eine Zeile aus einer gz-komprimierten Textdatei mit Python zu lesen, ohne die Datei vollständig zu extrahieren? Ich habe eine Text.gz Datei, die ungefähr 200mb ist. Wenn ich es extrahiere, wird es 7,4 GB. Und das ist nicht die einzige Datei, die ich lesen muss. Für den gesamten Prozess muss ich 10 Dateien lesen. Obwohl dies eine sequenzielle Arbeit sein wird, denke ich, dass es eine schlaue Sache ist, dies zu tun, ohne die gesamte Information auszubeuten. Ich weiß nicht einmal, dass es möglich ist. Wie kann es mit Python gemacht werden? Ich muss eine Textdatei Zeile für Zeile lesen.Python: Zeilen aus komprimierten Textdateien lesen

Antwort

38

Sie könnten das Standard-Gzip-Modul in Python verwenden. Verwenden Sie einfach:

gzip.open('myfile.gz') 

, um die Datei als jede andere Datei zu öffnen und seine Zeilen zu lesen.

Weitere Informationen hier: Python gzip module

+0

aus Neugier lädt dies die gesamte Datei in den Speicher? Oder ist es schlau genug, um Linien nach Bedarf zu laden? –

+1

@Sachin_ruk Dies lädt nicht die Datei, die es gerade öffnet. Um die Daten tatsächlich aus der Datei zu laden, müssen Sie '' 'f.readline()' 'ausführen, um Zeile zu Zeile zu lesen. Oder '' f.readlines (N) '' wo '' N'' ist die Anzahl der Zeilen, die Sie lesen möchten. – Tom

22

Mit gzip.GzipFile:

import gzip 

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

Hinweis : für python3 haben Sie die Datei angeben, in 'rt', als 'r' standardmäßig binäres Lesen geöffnet werden, oder Ansonsten verwenden Sie line.decode(...).

Hinweis : gzip.open(filename, mode) ist ein Alias ​​für gzip.GzipFile(filename, mode). Ich bevorzuge die ehemalige, wie es ähnlich aussieht with open(...) as f: zum Öffnen von unkomprimierten Dateien verwendet.

+18

Für python3 müssen Sie die zu öffnende Datei in 'rt' angeben, da 'r' standardmäßig auf binäres Lesen eingestellt ist. – kap

+1

oder verwenden Sie 'line.decode()' – dmeu

Verwandte Themen