Como Compactar Pastas Inteiras em Arquivo .ZIP com Python (shutil e zipfile)

 

Como Compactar Pastas Inteiras em Arquivo .ZIP com Python (shutil e zipfile)

Criar arquivos compactados no formato .zip é essencial para rotinas de backup, otimização de armazenamento e transferência de dados entre sistemas. Este script demonstra como utilizar os módulos nativos do Python — shutil para uma abordagem direta de linha única e zipfile para cenários que exigem maior controle sobre a inclusão de arquivos. A solução elimina a necessidade de softwares externos e automatiza a geração de pacotes compactados.

Python
import os
import shutil
import zipfile

# --- Abordagem 1: Usando shutil (Solução mais simples e rápida) ---
def compactar_pasta_simples(pasta_origem: str, arquivo_zip_saida: str) -> str:
    """Compacta todo o conteúdo de uma pasta em um arquivo .zip usando shutil."""
    # O shutil.make_archive adiciona a extensão .zip automaticamente no nome base
    nome_base = arquivo_zip_saida.replace(".zip", "")
    caminho_gerado = shutil.make_archive(nome_base, 'zip', pasta_origem)
    print(f"[shutil] Arquivo gerado com sucesso: {caminho_gerado}")
    return caminho_gerado


# --- Abordagem 2: Usando zipfile (Controle fino e navegação manual) ---
def compactar_pasta_manual(pasta_origem: str, arquivo_zip_saida: str) -> None:
    """Percorre e compacta uma pasta mantendo a estrutura de diretórios com zipfile."""
    with zipfile.ZipFile(arquivo_zip_saida, 'w', zipfile.ZIP_DEFLATED) as zip_out:
        for raiz, _, arquivos in os.walk(pasta_origem):
            for arquivo in arquivos:
                caminho_completo = os.path.join(raiz, arquivo)
                # Define o caminho relativo para evitar salvar a estrutura absoluta do sistema
                caminho_relativo = os.path.relpath(caminho_completo, start=pasta_origem)
                zip_out.write(caminho_completo, arcname=caminho_relativo)
                print(f"[zipfile] Adicionado: {caminho_relativo}")
    print(f"[zipfile] Compactação concluída: {arquivo_zip_saida}")


# --- Exemplo de uso prático ---
if __name__ == "__main__":
    pasta_teste = "./dados_projeto"
    zip_shutil_saida = "backup_projeto.zip"
    zip_manual_saida = "backup_projeto_manual.zip"

    # Criando pasta e arquivos fictícios para o teste
    os.makedirs(pasta_teste, exist_ok=True)
    with open(os.path.join(pasta_teste, "config.json"), "w") as f:
        f.write('{"status": "ok"}')
    
    # 1. Compactando de forma rápida com shutil
    compactar_pasta_simples(pasta_teste, zip_shutil_saida)

    # 2. Compactando com controle manual via zipfile
    compactar_pasta_manual(pasta_teste, zip_manual_saida)

Pontos-chave

  • shutil.make_archive: É a alternativa nativa mais eficiente para criar arquivos zip completos sem necessidade de iterar pelos diretórios manualmente.

  • zipfile.ZIP_DEFLATED: Deve ser especificado explicitamente ao criar um objeto ZipFile, pois o comportamento padrão (ZIP_STORED) apenas junta os arquivos no pacote sem aplicar compressão.

  • Parâmetro arcname em zipfile: Essencial para salvar a estrutura interna dos arquivos com caminhos relativos, evitando gravar diretórios absolutos (ex: /home/usuario/documentos/...) dentro do zip.

  • Iteração Recursiva com os.walk(): Permite mapear subpastas e arquivos em qualquer nível de profundidade ao utilizar a abordagem manual com a biblioteca zipfile.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

C# e Banco de Dados: Como Conectar e Realizar Operações com SQL Server