Jak rozpakować plik gz za pomocą Pythona

87

Muszę rozpakować plik gz, który pobrałem z witryny FTP na lokalny serwer plików systemu Windows. Mam ustawione zmienne dla lokalnej ścieżki pliku i wiem, że może być używane przez błotnisty GZIP.

Jak mogę to zrobić? Plik wewnątrz pliku GZ jest plikiem XML.

Darkdeamon
źródło
5
Czy możemy zobaczyć, czego próbowałeś?
heinst
1
Dlaczego jest to tak źle oceniane? Pytanie nie może być takie złe, biorąc pod uwagę, że istnieją 2 odpowiedzi z powyższymi jednostkowymi głosami za.
Paulo Neves,
@PauloNeves prawdopodobnie dlatego, że pytanie nie pokazuje żadnych badań jego autora.
bfontaine

Odpowiedzi:

145
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
źródło
3
dlaczego położyłeś sekundę z? czy to powszechna praktyka? możesz otworzyć kilka plików za pomocą tego samego menedżera kontekstu
RomainL.
1
Prawdopodobnie dlatego, że czytasz f_in i piszesz f_out. Zgodnie z dokumentacją, potrzebujesz parametrów do odczytu obj i zapisu do obiektu, docs.python.org/3/library/shutil.html#shutil.copyfileobj .
paxton91michael
@Matt Nie powinieneś również zamknąć f_in i f_out?
JeyJ
7
@JeyJ: taki jest cel instrukcji „with”. Wykonuje f_in.close () na istnieniu sekcji "with". Naprawdę przydatne, jeśli coś idzie nie tak (jak wyjątek). Zapewnia, że ​​zasób jest zamknięty
sweetdream
1
Zwróć uwagę, że shutil.copyfileobj()ma trzeci parametr length: „Długość całkowita, jeśli jest podana, to rozmiar bufora. W szczególności ujemna wartość długości oznacza kopiowanie danych bez zapętlania danych źródłowych w fragmentach; domyślnie dane są odczytywane fragmentami do unikaj niekontrolowanego zużycia pamięci ”.
norok2
30

Z dokumentacji:

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()
heinst
źródło
to rozwiązanie działa u mnie na pythonie 2.7 bez importowania żadnej biblioteki, @heinst wielkie dzięki
Farzad Farazmand
9

Może chcesz to również przekazać pandom.

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

    features_train = pd.read_csv(f)

features_train.head()
Feiyang.Chen
źródło
2
Co to ma wspólnego z pandami? „ Plik wewnątrz pliku GZ to plik XML ” - OP
cz
4

Nie jest to dokładna odpowiedź, ponieważ używasz danych xml i obecnie nie ma żadnej pd.read_xml()funkcji (od wersji 0.23.4), ale pandy (od wersji 0.21.0) mogą zdekompresować plik za Ciebie! Dzięki 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
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Nic3500,
1
świetna odpowiedź. Po prostu czyta skompresowany plik json w bardzo prosty (pythonowy) sposób.
lordcenzin
4

Jeśli parsujesz plik po rozpakowaniu, nie zapomnij użyć metody decode () , jest to konieczne, gdy otwierasz plik jako binarny.

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

gunzip('/tmp/file1.gz')
perfecto25
źródło
13
Należy pamiętać, że shnie jest to część standardowej instalacji.
Noumenon,