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 objetoZipFile, pois o comportamento padrão (ZIP_STORED) apenas junta os arquivos no pacote sem aplicar compressão.- Parâmetro
arcnameemzipfile: 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 bibliotecazipfile.

Comentários
Postar um comentário