ZipInfo.compress_level: controle a compressão ZIP

Publicado em: 24/10/2026
Tempo de leitura: 5 minutos
Ícone de compressão de arquivos ZIP

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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Código binário representando bytearray.resize no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    bytearray.resize: redimensione buffers com segurança

    Aprenda bytearray.resize no Python para expandir e reduzir buffers com segurança, limites e compatibilidade.

    Ler mais

    Tempo de leitura: 5 minutos
    24/10/2026
    Código Python em notebook para filtrar valores None
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    operator.is_none: filtre None sem perder falsy

    Aprenda operator.is_none e is_not_none para filtrar None sem remover valores falsy válidos no Python.

    Ler mais

    Tempo de leitura: 4 minutos
    23/10/2026
    Código Python em um notebook para criar dataclasses dinâmicas
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    make_dataclass decorator: transforme dataclasses

    Aprenda a usar o parâmetro decorator de make_dataclass para validar, registrar e transformar dataclasses dinâmicas no Python.

    Ler mais

    Tempo de leitura: 6 minutos
    23/10/2026
    Estrutura de código e XML para canonicalização com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    ElementTree canonicalize: normalize XML no Python

    Aprenda ElementTree canonicalize no Python para comparar XML, gerar hashes estáveis e controlar namespaces, espaços e comentários.

    Ler mais

    Tempo de leitura: 5 minutos
    22/10/2026
    Código de programação Python em uma tela
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    T-strings e templatelib: interpolação estruturada

    Aprenda t-strings e string.templatelib no Python para processar interpolações, criar renderizadores seguros e preservar dados estruturados.

    Ler mais

    Tempo de leitura: 6 minutos
    22/10/2026
    Banco SQLite e código Python para exportação seletiva com iterdump
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    SQLite iterdump: crie dumps seletivos no Python

    Aprenda sqlite3.Connection.iterdump com filtro para gerar dumps seletivos, validar dependências e restaurar bancos com segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    21/10/2026