shutil reúne operações de filesystem em alto nível, incluindo cópia, movimento, remoção de árvores e criação de arquivos compactados. A conveniência não elimina riscos: destinos existentes podem ser substituídos e metadados não são preservados integralmente em todos os sistemas.
from pathlib import Path
from shutil import copy2, make_archive
origem = Path("relatorios")
backup = Path("backup")
backup.mkdir(exist_ok=True)
for arquivo in origem.glob("*.csv"):
copy2(arquivo, backup / arquivo.name)
make_archive("backup-relatorios", "zip", root_dir=backup)
copy2() tenta manter mais metadados que copy(), mas proprietário, ACLs e atributos específicos podem se perder. make_archive() cria ZIP ou formatos tar a partir de uma raiz. Confirme o arquivo resultante e teste a restauração, pois criar um backup não prova que ele é recuperável.
Boas práticas
Resolva e valide caminhos antes de operações destrutivas. Não aceite diretamente de usuários um destino para rmtree(), move() ou extração. Ao descompactar conteúdo não confiável, inspecione membros e use os filtros seguros suportados pela versão adotada. Para cópia atômica, escreva em destino temporário e só depois substitua o arquivo final.
Use pathlib para construir caminhos e consulte automação de tarefas em Python para organizar scripts repetíveis.
A documentação oficial de shutil, consultada em 22 de julho de 2026, detalha a API e seus limites.