Cómo descomprimir un archivo gz usando Python

83

Necesito extraer un archivo gz que he descargado de un sitio FTP a un servidor de archivos local de Windows. Tengo las variables configuradas para la ruta local del archivo, y sé que GZIP confunde las puede usar.

¿Cómo puedo hacer esto? El archivo dentro del archivo GZ es un archivo XML.

Darkdeamon
fuente
5
¿Podemos ver lo que has probado, por favor?
2015
1
¿Por qué esto es tan negativo? La pregunta no puede ser tan mala dado que hay 2 respuestas con votos a favor unitarios anteriores.
Paulo Neves
@PauloNeves probablemente porque la pregunta no muestra ninguna investigación de su autor.
bfontaine

Respuestas:

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)
Mate
fuente
2
¿Por qué le pusiste un segundo? ¿Es esa una práctica común? puede abrir varios archivos con el mismo administrador de contexto
RomainL.
1
Probablemente porque lee f_in y escribe f_out. De acuerdo con los documentos, necesita parámetros para read obj y write obj, docs.python.org/3/library/shutil.html#shutil.copyfileobj .
paxton91michael
@ Matt ¿No deberías cerrar también f_in y f_out?
JeyJ
7
@JeyJ: este es el propósito de la declaración 'con'. Ejecuta f_in.close () en la existencia de la sección "with". Realmente útil si algo va mal (como una excepción). Se asegura de que el recurso esté cerrado
sweetdream
1
Tenga en cuenta que shutil.copyfileobj()tiene un tercer parámetro length: "La longitud entera, si se proporciona, es el tamaño del búfer. En particular, un valor de longitud negativo significa copiar los datos sin recorrer los datos de origen en fragmentos; de forma predeterminada, los datos se leen en fragmentos para evitar el consumo incontrolado de memoria ".
norok2
30

De la documentación:

import gzip
f = gzip.open('file.txt.gz', 'rb')
file_content = f.read()
f.close()
heinst
fuente
esta solución me funciona en python 2.7 sin importar ninguna biblioteca, @heinst muchas gracias
Farzad Farazmand
9

Quizás también quieras pasárselo a los pandas.

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

    features_train = pd.read_csv(f)

features_train.head()
Feiyang.Chen
fuente
2
¿Qué tiene esto que ver con los pandas? " El archivo dentro del archivo GZ es un archivo XML " - OP
cz
4

No es una respuesta exacta porque está usando datos xml y actualmente no hay ninguna pd.read_xml()función (a partir de v0.23.4), ¡pero los pandas (a partir de v0.21.0) pueden descomprimir el archivo por usted! ¡Gracias 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
fuente
3
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo.
Nic3500
1
gran respuesta. Simplemente lee un json comprimido de una manera muy simple (pitónica).
lordcenzin
3

Si está analizando el archivo después de descomprimirlo, no olvide usar el método decode () , es necesario cuando abre un archivo como binario.

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

gunzip('/tmp/file1.gz')
perfecto25
fuente
13
Tenga en cuenta que shno forma parte de la instalación estándar.
Noumenon