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.


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)

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


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()

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()

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())

2
from sh import gunzip

gunzip('/tmp/file1.gz')

13
Beachten Sie, dass dies shnicht Teil der Standardinstallation ist.
Noumenon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.