ZipInfo.compress_level: controla la compresión ZIP

Publicado el: 24/10/2026
Tempo de leitura: 5 minutos
Icono de compresión de archivos ZIP

El atributo público ZipInfo.compress_level permite elegir en Python un nivel de compresión diferente para cada elemento de un archivo ZIP. En lugar de aplicar una única configuración global, puedes ajustar textos, imágenes, bases de datos, registros y formatos ya comprimidos según sus características. Esta flexibilidad es útil en copias de seguridad, paquetes de software, exportaciones de datos y servicios web que generan archivos bajo demanda.

Qué representa ZipInfo

ZipInfo describe una entrada dentro de un ZIP. Guarda el nombre, la fecha, los permisos, el método de compresión y otros metadatos. Al crear una instancia manualmente, puedes definir esas propiedades antes de escribir los bytes con ZipFile.writestr(). El atributo público de nivel hace explícita la intención y evita depender de detalles internos.

from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED

info = ZipInfo("informe.txt")
info.compress_type = ZIP_DEFLATED
info.compress_level = 9

with ZipFile("paquete.zip", "w") as zf:
    zf.writestr(info, "contenido del informe")

En este ejemplo, solamente informe.txt usa nivel 9. Otras entradas pueden usar nivel 1, nivel 6 o almacenarse sin compresión.

Por qué conviene ajustar cada archivo

Texto, JSON, CSV, XML, Markdown y código fuente suelen comprimirse muy bien. Un nivel alto puede ahorrar bastante espacio. En cambio, JPEG, MP4, PDF optimizados, gzip y ZIP ya contienen datos comprimidos. Aplicar más trabajo de CPU a esos formatos normalmente produce poca reducción adicional.

La decisión también depende del escenario. Para una copia creada una vez y descargada muchas veces, una compresión lenta puede ser razonable. Para una API que crea un ZIP por solicitud, la velocidad puede importar más que ahorrar unos pocos megabytes. En servidores con mucha concurrencia, niveles altos pueden aumentar la latencia y reducir la capacidad total.

Política por extensión

from pathlib import Path
from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED

TEXTOS = {".txt", ".csv", ".json", ".xml", ".py", ".md"}
COMPRIMIDOS = {".jpg", ".jpeg", ".png", ".mp4", ".gz", ".zip"}

def agregar(zf, ruta):
    ruta = Path(ruta)
    datos = ruta.read_bytes()
    info = ZipInfo(ruta.name)

    if ruta.suffix.lower() in TEXTOS:
        info.compress_type = ZIP_DEFLATED
        info.compress_level = 9
    elif ruta.suffix.lower() in COMPRIMIDOS:
        info.compress_type = ZIP_STORED
    else:
        info.compress_type = ZIP_DEFLATED
        info.compress_level = 6

    zf.writestr(info, datos)

with ZipFile("archivos.zip", "w") as zf:
    for nombre in ["datos.csv", "foto.jpg", "manual.pdf"]:
        agregar(zf, nombre)

Esta función concentra la política y facilita las pruebas. Puedes medir tiempo y tamaño, cambiar los grupos de extensiones y añadir métricas sin dispersar números mágicos por todo el proyecto.

Métodos y rangos válidos

El significado del nivel depende del algoritmo. ZIP_DEFLATED suele trabajar con valores de 0 a 9, mientras otros métodos pueden usar rangos o significados distintos. Valida siempre la combinación de compress_type y compress_level. Un valor correcto para un método puede ser inválido para otro.

También debes considerar la compatibilidad del programa que abrirá el archivo. Algunas herramientas antiguas no admiten métodos modernos. DEFLATE sigue siendo una opción práctica cuando se necesita amplia interoperabilidad. Consulta la documentación oficial de zipfile y la especificación del formato ZIP.

Nivel global y nivel por entrada

ZipFile acepta el parámetro global compresslevel. Ese valor funciona como configuración predeterminada. ZipInfo.compress_level permite sobrescribirlo para una entrada concreta. Así puedes mantener nivel 6 para la mayoría, usar nivel 9 en grandes archivos de texto y evitar recomprimir contenido multimedia.

La granularidad ayuda a equilibrar velocidad y tamaño. También mejora la revisión del código porque la intención queda junto a los metadatos de la entrada.

Mide con datos reales

No elijas niveles únicamente por intuición. Crea muestras parecidas a producción y registra tiempo de compresión, tamaño final, tiempo de extracción, memoria y uso de CPU. Un archivo de texto grande se comporta de forma distinta a miles de archivos pequeños.

from pathlib import Path
from time import perf_counter

inicio = perf_counter()
# crea el archivo aquí
segundos = perf_counter() - inicio
tamano = Path("paquete.zip").stat().st_size
print({"segundos": segundos, "bytes": tamano})

Repite cada prueba, considera la caché del sistema de archivos y evalúa concurrencia real. En aplicaciones web, observa los percentiles altos de latencia, no solo el promedio.

Seguridad

Valida los nombres de las entradas antes de escribir. Rechaza rutas absolutas, secuencias como ../, caracteres de control y nombres duplicados cuando puedan confundir al consumidor. Limita la cantidad de entradas y el tamaño total, controla errores de lectura y evita incluir secretos mediante patrones demasiado amplios.

Al extraer ZIPs externos, resuelve el destino final y confirma que cada archivo permanece dentro del directorio permitido. Limita el tamaño descomprimido y trata enlaces con cuidado. Consulta nuestras guías de zipfile en Python y archivos TAR seguros.

Pathlib y pruebas automatizadas

pathlib simplifica el recorrido de directorios y la normalización de rutas. En pruebas, crea un directorio temporal, genera archivos de muestra, construye el ZIP, vuelve a abrirlo y comprueba nombres, métodos, contenido y manejo de errores. También puedes revisar pathlib en Python y nuestra guía de pruebas con pytest.

Arquitectura recomendada

Separa la política de la entrada y salida. Una función puede clasificar el archivo, otra construir su ZipInfo y otra escribir los datos. Esta división mejora las pruebas y permite modificar reglas sin cambiar el recorrido. Registra tamaño original, tamaño comprimido, método, nivel y duración.

Para archivos grandes, evita cargar todo en memoria. Comprueba el espacio libre, escribe en un destino temporal y renombra el resultado de forma atómica cuando termine correctamente. Si ocurre un error, elimina el archivo incompleto.

Buenas prácticas

Usa un valor global razonable; sobrescribe solo cuando las mediciones demuestren una ventaja; evita recomprimir formatos ya comprimidos; valida método y rango; documenta requisitos de compatibilidad; prueba el ZIP con varios lectores; controla CPU y latencia en producción; y usa constantes o una política clara en lugar de números sin explicación.

Conclusión

ZipInfo.compress_level ofrece control preciso sobre cada miembro de un ZIP. Su ventaja no consiste en usar siempre el nivel máximo, sino en aplicar una política explícita y medida que equilibre tamaño, CPU, latencia, compatibilidad y simplicidad operativa para cada clase de datos.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Código binario que representa bytearray.resize en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    bytearray.resize: redimensiona buffers con seguridad

    Aprende bytearray.resize en Python para ampliar y reducir búferes con límites, memoryview y compatibilidad.

    Ler mais

    Tempo de leitura: 5 minutos
    24/10/2026
    Código Python en un portátil para filtrar valores None
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    operator.is_none: filtra None sin perder falsy

    Aprende operator.is_none e is_not_none para filtrar None sin eliminar valores falsy válidos en Python.

    Ler mais

    Tempo de leitura: 4 minutos
    23/10/2026
    Código Python en un portátil para crear dataclasses dinámicas
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    make_dataclass decorator: transforma dataclasses

    Aprende a usar el parámetro decorator de make_dataclass para validar, registrar y transformar dataclasses dinámicas en Python.

    Ler mais

    Tempo de leitura: 6 minutos
    23/10/2026
    Estructura de código y XML para canonicalización con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    ElementTree canonicalize: normaliza XML en Python

    Aprende ElementTree canonicalize en Python para comparar XML, generar hashes estables y controlar namespaces, espacios y comentarios.

    Ler mais

    Tempo de leitura: 5 minutos
    22/10/2026
    Código Python en una pantalla
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    T-strings y templatelib: interpolación estructurada

    Aprende t-strings y string.templatelib en Python para interpolación estructurada, renderizado seguro, logs y procesamiento personalizado.

    Ler mais

    Tempo de leitura: 6 minutos
    22/10/2026
    Base SQLite y código Python para exportación selectiva con iterdump
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    SQLite iterdump: crea dumps selectivos en Python

    Aprende sqlite3.Connection.iterdump con filtro para crear dumps SQLite selectivos, validar dependencias y restaurar con seguridad.

    Ler mais

    Tempo de leitura: 4 minutos
    21/10/2026