HOWTO · Python

Leer archivo gzip en Python

Este tutorial destaca la importancia de comprimir un archivo y demuestra cómo comprimir y descomprimir usando gzip en Python.

En esta página

Usa el módulo gzip de la biblioteca estándar de Python para leer un archivo .gz sin extraerlo primero. Ábrelo con gzip.open() en modo binario para obtener bytes, o en modo texto con una codificación explícita para obtener cadenas. Los ejemplos siguientes también muestran cómo crear, anexar datos y descomprimir archivos gzip.

Leer un archivo gzip en Python

Un archivo gzip almacena datos comprimidos en el formato gzip. gzip.open() presenta su contenido como un objeto similar a un archivo, por lo que puedes leer todos los datos de una vez o procesarlos línea por línea. El siguiente ejemplo crea un archivo gzip pequeño y lee su contenido como texto UTF-8; al crear la entrada en el mismo programa, el ejemplo es autónomo.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import gzip
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as directory:
    path = Path(directory) / "notes.txt.gz"
    with gzip.open(path, "wt", encoding="utf-8") as compressed:
        compressed.write("Python makes gzip files easy to read.\n")

    with gzip.open(path, "rt", encoding="utf-8") as compressed:
        print(compressed.read(), end="")

Elegir el modo binario o de texto

Usa rb cuando el contenido comprimido sean bytes, como los de una imagen u otro formato binario. Al recorrer un flujo gzip binario se obtienen secuencias de bytes. Usa rt cuando el contenido sea texto; indica explícitamente la codificación de caracteres para que Python decodifique esos bytes de forma coherente. Los modos equivalentes de gzip.open() son wb para escribir bytes y wt para escribir texto. Un flujo de texto acepta cadenas, mientras que uno binario acepta bytes.

Para archivos de texto grandes, recorre el flujo de texto en vez de cargar todo el contenido en memoria: for line in compressed:. El administrador de contexto cierra el flujo gzip incluso si el procesamiento se interrumpe antes de tiempo. La compresión puede reducir el espacio de almacenamiento y el tamaño de transferencia cuando los datos lo permiten, pero comprimir y descomprimir requiere tiempo de CPU; el ahorro depende de los datos.

Escribir un archivo gzip en Python

Abre el archivo de destino con wt para escribir texto o con wb para escribir bytes. El modo w crea un flujo gzip nuevo y reemplaza el destino si ya existe. Este ejemplo crea tanto el texto de origen como la salida comprimida y luego lee el resultado para mostrar que la escritura se puede utilizar:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import gzip
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as directory:
    path = Path(directory) / "report.txt.gz"
    with gzip.open(path, "wt", encoding="utf-8") as compressed:
        compressed.write("Daily report\n")
    with gzip.open(path, "rt", encoding="utf-8") as compressed:
        print(compressed.read(), end="")

Anexar datos a un archivo gzip

Usa at para anexar texto o ab para anexar bytes. Si necesitas conservar el contenido existente, no uses wb: el modo de escritura inicia un flujo gzip nuevo. Al anexar, se puede agregar otro miembro gzip al archivo; los lectores gzip pueden leer los miembros concatenados como un único flujo lógico.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import gzip
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as directory:
    path = Path(directory) / "log.txt.gz"
    with gzip.open(path, "wt", encoding="utf-8") as compressed:
        compressed.write("first entry\n")
    with gzip.open(path, "at", encoding="utf-8") as compressed:
        compressed.write("second entry\n")
    with gzip.open(path, "rt", encoding="utf-8") as compressed:
        print(compressed.read(), end="")

Descomprimir un archivo gzip en Python

Para crear un archivo normal sin comprimir, abre el archivo gzip de origen para leerlo y el archivo de destino para escribir en él; después, copia los datos del origen al destino. El orden importa: el flujo gzip es la entrada y el archivo normal es la salida. El modo binario sirve tanto para contenido de texto como para contenido no textual, y evita decodificar o modificar los bytes.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import gzip
import shutil
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as directory:
    source = Path(directory) / "archive.txt.gz"
    destination = Path(directory) / "archive.txt"
    with gzip.open(source, "wb") as compressed:
        compressed.write(b"Recovered contents\n")
    with gzip.open(source, "rb") as compressed:
        with destination.open("wb") as output:
            shutil.copyfileobj(compressed, output)
    print(destination.read_text(encoding="utf-8"), end="")

Elige el modo de texto cuando quieras cadenas decodificadas y conozcas la codificación del archivo; elige el modo binario cuando necesites los bytes originales o trabajes con datos que no sean texto. Usa wt o wb para crear un archivo comprimido y at o ab para anexar datos. Para extraer el contenido a un archivo normal, lee desde el archivo gzip.