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.







