Renomeação em Massa de Arquivos em Python: Padrões Pré-definidos e Automação
O gerenciamento de arquivos é uma tarefa rotineira em processos de análise de dados, organização documental e suporte a sistemas de TI. Realizar a renomeação manual de dezenas ou centenas de arquivos é uma atividade ineficiente e suscetível a erros humanos. A linguagem Python oferece módulos nativos e eficientes para automatizar esse trabalho de forma flexível, garantindo a padronização precisa do sistema de arquivos com poucas linhas de código.
Este artigo apresenta um guia passo a passo para implementar a renomeação em massa utilizando padrões pré-definidos, desde operações básicas com prefixos até a manipulação avançada com expressões regulares e boas práticas de segurança.
1. Bibliotecas Nativas para Gerenciamento de Arquivos
Para interagir com o sistema operacional e manipular caminhos de arquivos, o Python disponibiliza duas bibliotecas nativas que não exigem instalações adicionais:
- Módulo
os: A ferramenta clássica da linguagem, que oferece funções diretas comoos.rename()para alterar nomes,os.listdir()eos.scandir()para listar conteúdos de diretórios, eos.path.join()para construir caminhos compatíveis com diferentes sistemas operacionais. - Módulo
pathlib: Introduzido nas versões modernas do Python, disponibiliza uma abordagem orientada a objetos para o sistema de arquivos através da classePath. A sintaxe torna o código mais legível e nativamente compatível entre Windows, macOS e Linux.
2. Padrão 1: Inserção de Prefixos e Sufixos
Adicionar marcadores no início ou no final dos nomes de arquivos é útil para indicar estados de processamento, como marcar documentos com um prefixo de cópia de segurança.
O exemplo abaixo demonstra como utilizar a biblioteca pathlib para percorrer um diretório e adicionar o prefixo backup_ a todos os arquivos com extensão .txt:
from pathlib import Path
# Definição do diretório de destino
folder_path = Path("./documents")
# Iteração sobre arquivos .txt para adição de prefixo
for file_path in folder_path.glob("*.txt"):
if file_path.is_file():
new_name = f"backup_{file_path.name}"
file_path.rename(folder_path / new_name)
print("Prefixo adicionado com sucesso!")
3. Padrão 2: Numeração Sequencial com Zeros à Esquerda
A padronização por numeração sequencial (como produto_001.png, produto_002.png) é ideal para organizar imagens de catálogos, faturas ou conjuntos de dados para modelos de aprendizado de máquina.
Para garantir que os arquivos permaneçam ordenados corretamente nos navegadores do sistema de arquivos, utiliza-se a formatação com preenchimento de zeros à esquerda (zero-padding). O código a seguir utiliza a função enumerate() com início em 1 e a f-string com especificador :03d:
from pathlib import Path
folder_path = Path("./images")
# Obtenção e ordenação dos arquivos PNG
files = sorted([f for f in folder_path.glob("*.png") if f.is_file()])
# Renomeação sequencial formatada
for index, file_path in enumerate(files, start=1):
new_name = f"product_{index:03d}{file_path.suffix}"
file_path.rename(folder_path / new_name)
print(f"Sucesso ao renomear {len(files)} arquivos!")
Alternativamente, quando se utiliza o módulo os, o método de string .zfill() atinge o mesmo resultado ao definir a quantidade fixa de dígitos numéricos desejada (por exemplo, str(count).zfill(2) para dois dígitos).
4. Padrão 3: Substituição de Caracteres e Padronização de Caixa
Nomes de arquivos contendo espaços em branco ou caracteres especiais podem causar falhas de compatibilidade em servidores e scripts automatizados. Substituir espaços por underscores e converter todos os caracteres para letras minúsculas garante a uniformização do sistema.
O script a seguir utiliza os.listdir() juntamente com os métodos de string .replace() e .lower() para higienizar os nomes dentro de uma pasta:
import os
folder_path = "./reports"
for filename in os.listdir(folder_path):
old_file_path = os.path.join(folder_path, filename)
if os.path.isfile(old_file_path):
# Substituição de espaços por underscores e conversão para minúsculas
new_filename = filename.replace(" ", "_").lower()
new_file_path = os.path.join(folder_path, new_filename)
os.rename(old_file_path, new_file_path)
print("Nomes de arquivos padronizados com sucesso!")
5. Padrão 4: Reestruturação Avançada com Expressões Regulares (Regex)
Quando os arquivos seguem um padrão complexo que precisa ser reordenado — como alterar o formato de uma data no nome do arquivo de AAAA-MM-DD_nome.csv para DD-MM-AAAA_nome.csv —, a combinação do módulo re com a manipulação de arquivos oferece precisão total.
O exemplo a seguir utiliza o método re.compile() para capturar os grupos da data e reconstruir o nome conforme a especificação desejada:
import re
from pathlib import Path
folder_path = Path("./data")
# Padrão Regex para identificar arquivos YYYY-MM-DD_nome.csv
pattern = re.compile(r"^(\d{4})-(\d{2})-(\d{2})_(.*)\.csv$")
for file_path in folder_path.glob("*.csv"):
match = pattern.match(file_path.name)
if match:
year, month, day, rest = match.groups()
# Reordenação para o formato DD-MM-YYYY_nome.csv
new_name = f"{day}-{month}-{year}_{rest}.csv"
file_path.rename(folder_path / new_name)
print("Renomeação com Regex concluída!")
6. Padrão 5: Ordenação por Data de Modificação do Arquivo
Em determinados cenários, a numeração sequencial precisa respeitar a ordem cronológica em que os arquivos foram alterados ou criados, e não a ordem alfabética de seus nomes originais.
Para isso, é possível utilizar a função os.path.getmtime() como chave de ordenação com a função sorted() antes de aplicar o padrão de renomeação:
import os
path_name = r"C:\py_scripts\photos\data"
# Listagem e ordenação por data de última modificação
name_list = os.listdir(path_name)
full_list = [os.path.join(path_name, i) for i in name_list]
sorted_list = sorted(full_list, key=lambda x: os.path.getmtime(x))
count = 0
for file_path in sorted_list:
prefix = "photo-"
counter = str(count).zfill(2)
new_name = f"{prefix}{counter}.jpg"
src = file_path
dst = os.path.join(path_name, new_name)
os.rename(src, dst)
count += 1
print("Arquivos renomeados sequencialmente por data de modificação!")
7. Regras de Segurança e Prevenção de Perda de Dados
A execução de scripts de automação em massa sobre o sistema de arquivos é uma operação irreversível. Para evitar a perda acidental de dados ou a sobrescrita não pretendida, recomenda-se adotar três regras de segurança essenciais:
- Realizar Backup Prévio: Crie sempre uma cópia de segurança do diretório de trabalho antes de rodar o script pela primeira vez.
- Executar em Modo de Teste (“Dry-Run”): Substitua a chamada da função de renomeação (
file_path.rename()ouos.rename()) por uma instrução de impressão (print()). Isso permite visualizar no terminal a transformação do nome antigo para o novo nome sem alterar o disco.
# Exemplo de verificação em modo Dry-Run
print(f"[DRY-RUN] {file_path.name} ---> {new_name}")
- Verificar Sobrescrita Existente: Antes de aplicar a alteração, confirme se o novo nome já não pertence a outro arquivo no diretório utilizando o método
.exists()nopathlibouos.path.exists().
Conclusão
A automação do processo de renomeação de arquivos em lote com Python transforma tarefas repetitivas em rotinas ágeis e confiáveis. Seja aplicando simples prefixos com pathlib, padronizando índices com enumerate(), limpando caracteres com replace(), ou reestruturando nomes complexos com expressões regulares, a linguagem fornece todas as ferramentas necessárias para manter repositórios de dados organizados e prontos para produção.
