Python y los archivos zip

¿Qué es un zip?

Un zip es un archivo con formato comprimido que puede contener uno o más archivos y directorios en su interior. La ventaja principal es que reduce el tamaño de los archivos, lo cual facilita su almacenamiento y transferencia. Es como una caja que contiene varios objetos, pero la caja está compactada para ocupar menos espacio.

El módulo zipfile de Python

Es una biblioteca estandar de Python que permite trabajar con archivos zip, ya sea creándolos, abriéndolos, extrayendo contenido o incluso modificando su estructura interna.

El módulo zipfile proporciona clases para crear, leer, escribir y extraer archivos zip. Ofrece una interfaz sencilla para interactuar con estos archivos, sin necesidad de entender los detalles del formato zip internamente.

Clases principales

  • ZipFile(nombre_archivo, modo): Esta clase es la base para trabajar con archivos zip.
    • nombre_archivo: La ruta al archivo ZIP que quieres usar.
    • modo: Especifica cómo se abrirá el archivo:
      • 'r' (read): Abre el archivo zip para lectura.
      • 'w' (write): Crea un nuevo archivo zip o lo sobrescribe si ya existe.
      • 'a' (append): Añade archivos al archivo zip existente.
      • 'x' (create): Crea un nuevo archivo zip, pero falla si el archivo ya existe.
  • ZipInfo: Representa la información de un solo miembro (archivo o directorio) dentro del archivo zip. Contiene detalles como el nombre, tamaño, fecha de modificación y si es un directorio.
  • ZipFile.namelist(): Devuelve una lista de los nombres de todos los archivos y directorios dentro del archivo zip.
  • ZipFile.getinfo(nombre): Devuelve un objeto ZipInfo para el miembro especificado por su nombre.
  • ZipFile.write(nombre_archivo, filename=None, compress_type=zipfile.ZIP_DEFLATED): Escribe un archivo o directorio en el archivo zip.
    • nombre_archivo: La ruta al archivo que se va a añadir.
    • filename: El nombre con el que se guardará el archivo dentro del archivo zip. Si no se especifica, usa el nombre original.
    • compress_type: El tipo de compresión a usar (por ejemplo, zipfile.ZIP_DEFLATED es la más común).
  • ZipFile.extract(nombre_archivo, filename=None, pwd=None): Extrae un archivo o directorio del archivo ZIP al directorio actual.
    • nombre_archivo: El nombre del archivo dentro del ZIP que se va a extraer.
    • filename: El nombre con el que se guardará el archivo extraído. Si no se especifica, usa el nombre original.
    • pwd: La contraseña para descomprimir el archivo (si está protegido).

Ejemplos:

1. Crear un archivo zip

import zipfile

# Nombre del archivo ZIP que queremos crear
nombre_archivo_zip = "mi_archivo.zip"

# Crear un objeto ZipFile en modo escritura ('w')
with zipfile.ZipFile(nombre_archivo_zip, 'w') as archivo_zip:
    # Añadir archivos al archivo ZIP
    archivo_zip.write("archivo1.txt")  # Añade el archivo "archivo1.txt"
    archivo_zip.write("carpeta/archivo2.txt") # Añade un archivo dentro de una carpeta

2. Añadir archivos a un zip existente

import zipfile

nombre_archivo_zip = "mi_archivo.zip"

with zipfile.ZipFile(nombre_archivo_zip, 'a') as archivo_zip:
    archivo_zip.write("archivo3.txt") # Añade un nuevo archivo

3. Extraer archivos de un zip

import zipfile

nombre_archivo_zip = "mi_archivo.zip"

with zipfile.ZipFile(nombre_archivo_zip, 'r') as archivo_zip:
    # Extraer todos los archivos al directorio actual
    archivo_zip.extractall()

    # Extraer un archivo específico con un nombre diferente
    archivo_zip.extract("archivo1.txt", "nuevo_nombre_archivo.txt") # Extrae "archivo1.txt" y lo guarda como "nuevo_nombre_archivo.txt"

4. Trabajando con contraseñas

La biblioteca no puede proteger el archivo zip con contraseña, pero si puede descomprimir un archivo zip protegido con esta.

import zipfile

nombre_archivo_zip = "mi_archivo.zip"
clave = b"mi_clave" # La contraseña debe ser bytes

with zipfile.ZipFile(nombre_archivo_zip, 'r') as archivo_zip:
    try:
        archivo_zip.extractall(pwd=clave)
    except RuntimeError as e:
        print(f"Error al extraer el archivo: {e}")

Cosas a tener en cuenta

  • Siempre usar with para abrir archivos zip, esto asegura que se cierren correctamente incluso si ocurren errores.
  • La contraseña debe ser un objeto de bytes (b"") y no una cadena normal.

Recursos adicionales

Esto es una introducción a la biblioteca zipfile, si estás interesado en usarla en tus scripts encontrarás mas información aquí: https://docs.python.org/3.13/library/zipfile.html#zipfile.ZipInfo._for_archive

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *