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.


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)

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


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

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

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

2
from sh import gunzip

gunzip('/tmp/file1.gz')

13
Tenga en cuenta que shno forma parte de la instalación estándar.
Noumenon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.