Copiar e mover arquivos em Python: trabalhando com os módulos shutil e os
Desenvolver em Python frequentemente exige operações com arquivos e diretórios. Criar backups, processar uploads de usuários, organizar a estrutura de projetos, implantar aplicações — todas essas tarefas requerem gerenciamento programático do sistema de arquivos. Automatizar essas operações simplifica drasticamente o gerenciamento de dados e elimina a necessidade de executar tarefas repetitivas manualmente.
O módulo shutil em Python fornece utilitários de alto nível para trabalhar com arquivos e diretórios. Combinado com o módulo os, ele forma um conjunto poderoso de ferramentas multiplataforma para criar scripts flexíveis de gerenciamento do sistema de arquivos. Ambos os módulos fazem parte da biblioteca padrão do Python e estão disponíveis sem instalação adicional.
Visão geral do módulo shutil
O módulo shutil, cujo nome vem de "shell utility", é um conjunto de funções para operações de alto nível com arquivos e diretórios. As principais funções do módulo incluem:
copy()— copia um arquivo sem preservar metadadoscopy2()— copia um arquivo preservando todos os metadadoscopytree()— copia diretórios inteiros recursivamentemove()— move arquivos e pastas para um novo localrmtree()— remove diretórios recursivamente com todo o conteúdocopyfileobj()— copia objetos de arquivo byte a byte
O módulo shutil se integra eficientemente com o módulo os e é adequado tanto para pequenos scripts de automação quanto para grandes aplicações de nível corporativo.
Métodos de cópia de arquivos
Cópia básica com shutil.copy()
A função shutil.copy() realiza uma cópia simples do conteúdo do arquivo sem transferir metadados:
import shutil
origem = 'pasta_origem/exemplo.txt'
destino = 'pasta_destino/exemplo.txt'
shutil.copy(origem, destino)
Esta função copia apenas o conteúdo do arquivo. Metadados como data de criação, hora da última modificação e permissões de acesso não são preservados. A função é análoga ao comando cp em sistemas Unix/Linux sem flags de preservação de atributos.
É importante lembrar que, se o diretório de destino não existir, ocorrerá um erro. Recomenda-se verificar previamente a existência do diretório de destino ou criá-lo programaticamente.
Cópia com preservação de metadados: shutil.copy2()
Quando for necessário preservar todas as informações do arquivo, incluindo carimbos de data/hora, proprietário e permissões de acesso, utilize a função copy2():
shutil.copy2('arquivo.txt', 'backup/arquivo.txt')
Este método é especialmente útil ao criar backups, migrar projetos entre diferentes sistemas ou quando a preservação dos atributos originais dos arquivos é crítica. A função copy2() garante a reprodução mais fiel possível do arquivo original no novo local.
Cópia de diretórios
Cópia recursiva com shutil.copytree()
Para copiar diretórios inteiros com todos os subdiretórios e arquivos aninhados, use a função copytree():
shutil.copytree('projeto_antigo', 'projeto_novo')
Por padrão, a função copytree() gera um erro FileExistsError se o diretório de destino já existir. A partir do Python 3.8, é possível usar o parâmetro dirs_exist_ok=True para permitir a sobrescrita ou complementação do conteúdo:
shutil.copytree('projeto_antigo', 'projeto_novo', dirs_exist_ok=True)
A função funciona recursivamente e é aplicada nos seguintes cenários:
- Clonagem de templates de projetos