So entpacken Sie eine gz-Datei mit Python

83

Ich muss eine gz-Datei extrahieren, die ich von einer FTP-Site auf einen lokalen Windows-Dateiserver heruntergeladen habe. Ich habe die Variablen für den lokalen Pfad der Datei festgelegt und weiß, dass sie von GZIP muddle verwendet werden können.

Wie kann ich das machen? Die Datei in der GZ-Datei ist eine XML-Datei.

Darkdeamon
quelle
5
Können wir bitte sehen, was Sie versucht haben?
heinst
1
Warum ist das so herabgestuft? Die Frage kann nicht so schlimm sein, da es 2 Antworten mit den oben genannten einheitlichen Gegenstimmen gibt.
Paulo Neves
@PauloNeves wahrscheinlich, weil die Frage überhaupt keine Forschung von seinem Autor zeigt.
Bfontaine

Antworten:

140
import gzip
import shutil
with gzip.open('file.txt.gz', 'rb') as f_in:
    with open('file.txt', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)
Matt
quelle
2
Warum hast du eine Sekunde mit gesetzt? ist das gängige Praxis? Sie können mehrere Dateien mit demselben Kontextmanager
öffnen
1
Wahrscheinlich, weil Sie f_in lesen und f_out schreiben. Gemäß den Dokumenten benötigen Sie Parameter für das Lesen von obj und ein Schreibobjekt, docs.python.org/3/library/shutil.html#shutil.copyfileobj .
paxton91michael
@Matt Solltest du nicht auch f_in und f_out schließen?
JeyJ
7
@JeyJ: Dies ist der Zweck der 'with'-Anweisung. Es führt f_in.close () an der Stelle des Abschnitts "with" aus. Wirklich nützlich, wenn etwas schief geht (wie eine Ausnahme). Es stellt sicher, dass die Ressource geschlossen ist
sweetdream
1
Beachten Sie, dass dies shutil.copyfileobj()einen dritten Parameter hat length: "Die Ganzzahllänge ist, falls angegeben, die Puffergröße. Insbesondere bedeutet ein negativer Längenwert, dass die Daten kopiert werden, ohne die Quelldaten in Blöcken zu durchlaufen. Standardmäßig werden die Daten in Blöcken in gelesen Vermeiden Sie unkontrollierten Speicherverbrauch. "
norok2
30

Aus der Dokumentation:

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()
heinst
quelle
Diese Lösung funktioniert für mich unter Python 2.7, ohne eine Bibliothek zu importieren. @heinst vielen Dank
Farzad Farazmand
9

Vielleicht möchten Sie es auch an Pandas weitergeben.

with gzip.open('features_train.csv.gz') as f:

    features_train = pd.read_csv(f)

features_train.head()
Feiyang.Chen
quelle
2
Was hat das mit Pandas zu tun? " Die Datei in der GZ-Datei ist eine XML-Datei " - OP
cz
4

Keine genaue Antwort, da Sie XML-Daten verwenden und derzeit keine pd.read_xml()Funktion (ab Version 0.23.4) vorhanden ist, aber Pandas (ab Version 0.21.0) können die Datei für Sie dekomprimieren! Danke Wes!

import pandas as pd
import os
fn = '../data/file_to_load.json.gz'
print(os.path.isfile(fn))
df = pd.read_json(fn, lines=True, compression='gzip')
df.tail()
whs2k
quelle
3
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Nic3500
1
gute Antwort. Es liest einfach einen komprimierten JSON auf sehr einfache (pythonische) Weise.
Lordcenzin
3

Wenn Sie die Datei nach dem Entpacken analysieren, vergessen Sie nicht, die decode () -Methode zu verwenden. Dies ist erforderlich, wenn Sie eine Datei als Binärdatei öffnen.

import gzip
with gzip.open(file.gz, 'rb') as f:
    for line in f:
        print(line.decode().strip())
Pedro J. Sola
quelle
2
from sh import gunzip

gunzip('/tmp/file1.gz')
perfecto25
quelle
13
Beachten Sie, dass dies shnicht Teil der Standardinstallation ist.
Noumenon