¿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 objetoZipInfo
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