O atributo público ZipInfo.compress_level permite controlar o nível de compressão de cada item de um arquivo ZIP no Python. Em vez de aplicar uma única configuração para todo o pacote, você pode escolher níveis diferentes conforme o tipo, o tamanho e a frequência de acesso de cada arquivo. Isso é útil em backups, distribuidores de software, exportações de dados e pipelines que misturam texto, imagens, bancos de dados e arquivos já comprimidos.
O que é ZipInfo
ZipInfo representa a entrada de um arquivo dentro de um ZIP. Ele armazena nome, data, permissões, método de compressão e outros metadados. Ao criar uma instância manualmente, você pode definir propriedades antes de gravar os bytes com ZipFile.writestr(). O atributo compress_level torna explícita a escolha do nível por entrada, melhorando a legibilidade do código e evitando depender de detalhes internos.
from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED
info = ZipInfo("relatorio.txt")
info.compress_type = ZIP_DEFLATED
info.compress_level = 9
with ZipFile("pacote.zip", "w") as zf:
zf.writestr(info, "conteúdo do relatório")
Nesse exemplo, somente relatorio.txt recebe nível 9. Outras entradas podem usar nível 1, 6 ou até ser armazenadas sem compressão.
Quando usar níveis diferentes
Arquivos de texto, JSON, CSV, XML e código-fonte normalmente comprimem muito bem. Para eles, níveis maiores podem reduzir bastante o tamanho. Imagens JPEG, vídeos MP4, PDFs já otimizados e arquivos gzip geralmente oferecem pouco ganho adicional. Nesses casos, gastar mais CPU pode não valer a pena. Uma estratégia prática é usar nível alto para texto, nível intermediário para documentos e nível baixo ou armazenamento direto para formatos já comprimidos.
O melhor nível depende também do objetivo. Em um backup criado uma vez e baixado muitas vezes, vale gastar mais CPU na criação. Em um endpoint que gera ZIPs sob demanda, a velocidade pode ser mais importante do que alguns megabytes de economia. Em sistemas embarcados ou servidores com muitos usuários simultâneos, níveis altos podem aumentar latência e consumo de CPU.
Exemplo com política por extensão
from pathlib import Path
from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
TEXTOS = {".txt", ".csv", ".json", ".xml", ".py", ".md"}
JA_COMPRIMIDOS = {".jpg", ".jpeg", ".png", ".mp4", ".gz", ".zip"}
def adicionar(zf, caminho):
caminho = Path(caminho)
dados = caminho.read_bytes()
info = ZipInfo(caminho.name)
if caminho.suffix.lower() in TEXTOS:
info.compress_type = ZIP_DEFLATED
info.compress_level = 9
elif caminho.suffix.lower() in JA_COMPRIMIDOS:
info.compress_type = ZIP_STORED
else:
info.compress_type = ZIP_DEFLATED
info.compress_level = 6
zf.writestr(info, dados)
with ZipFile("arquivos.zip", "w") as zf:
for nome in ["dados.csv", "foto.jpg", "manual.pdf"]:
adicionar(zf, nome)
A função centraliza a política e facilita testes. Você pode medir tempo e tamanho, ajustar extensões e registrar métricas sem espalhar números mágicos pelo projeto.
Compatibilidade com métodos de compressão
O significado do nível varia conforme o algoritmo. ZIP_DEFLATED costuma aceitar níveis de 0 a 9. Outros métodos podem usar faixas diferentes. Portanto, valide a combinação de compress_type e compress_level. Um valor adequado para um algoritmo pode ser inválido ou ter outro efeito em outro.
Também é importante considerar a compatibilidade do consumidor. Nem todo descompactador antigo reconhece métodos modernos. Para máxima interoperabilidade, DEFLATE continua sendo uma escolha segura. Consulte a documentação oficial de zipfile e a especificação do formato ZIP antes de adotar um método menos comum.
Diferença entre nível global e nível por arquivo
ZipFile permite definir compresslevel na criação do arquivo. Essa configuração serve como padrão global. Já ZipInfo.compress_level é útil quando uma entrada precisa substituir esse padrão. Assim, você pode manter nível 6 para a maioria dos arquivos e usar nível 9 apenas em grandes arquivos de texto.
Essa granularidade ajuda a equilibrar desempenho e tamanho. Ela também deixa a intenção registrada junto aos metadados da entrada, o que torna o fluxo mais fácil de revisar.
Medição de desempenho
Evite escolher níveis apenas por intuição. Gere amostras reais, registre o tempo de compressão, o tamanho final e o tempo de extração. Compare diferentes níveis com os dados usados em produção. Um arquivo de 10 MB de texto pode ter comportamento muito diferente de milhares de pequenos arquivos.
from time import perf_counter
from pathlib import Path
inicio = perf_counter()
# crie o ZIP aqui
segundos = perf_counter() - inicio
tamanho = Path("pacote.zip").stat().st_size
print(segundos, tamanho)
Repita o teste várias vezes e descarte medições anormais. Em aplicações web, avalie também concorrência e uso de memória.
Segurança ao criar ZIPs
Controle os nomes das entradas para evitar caminhos absolutos e sequências como ../. Mesmo que você esteja criando, e não extraindo, um ZIP malformado pode causar problemas quando outra ferramenta o abrir. Normalize nomes, limite tamanhos, imponha quantidade máxima de entradas e trate erros de leitura.
Ao extrair arquivos recebidos, nunca confie apenas no nome da entrada. Valide o caminho final, bloqueie links perigosos e limite o total descompactado. Veja também nosso guia de zipfile no Python e o artigo sobre arquivos TAR seguros.
Integração com pathlib e testes
pathlib facilita percorrer diretórios e ler arquivos. Em testes, crie uma pasta temporária, gere o ZIP e abra-o novamente para confirmar nomes, métodos e conteúdo. Confira nosso conteúdo sobre pathlib no Python e o guia de testes com pytest.
Boas práticas
Defina uma política clara por tipo de arquivo; use constantes nomeadas; mantenha um nível global razoável; sobrescreva apenas quando houver benefício medido; valide algoritmos e faixas; registre métricas; teste o ZIP gerado; documente requisitos de compatibilidade; e evite recomprimir dados que já estão compactados.
Conclusão
ZipInfo.compress_level oferece controle fino sobre cada entrada de um ZIP. Usado com medições e uma política simples, ele reduz tamanho sem desperdiçar CPU. A principal vantagem não é usar sempre o nível máximo, mas escolher conscientemente o melhor equilíbrio para cada tipo de dado e para o ambiente onde o arquivo será criado e consumido.







