Sobrescrever arquivos com os.rename. (Python)
Overview
Bem-vindo a uma solução prática e descomplicada para um dos dilemas mais comuns na programação com Python: renomear arquivos sem receber o temido erro de arquivo existente. Neste post, vou guiá-lo por duas maneiras eficientes de contornar esse obstáculo, seja removendo o arquivo destino antes da renomeação ou utilizando a facilidade do pacote ‘shutil’. Preparado para tornar seu código mais eficiente e seguro? Vamos lá!
A função rename, como o próprio nome sugere, vai renomear um arquivo. Todavia, ela retorna o seguinte erro, caso o arquivo destino exista: “[WinError 183] Cannot create a file when that file already exists…”. Neste post mostro como contornar este problema.
Até o momento, não existe uma forma de forçar que a função rename sobrescreva o arquivo destino (ou o novo nome do arquivo). Todavia, temos duas opções simples para contornar este problema.
Removendo o novo arquivo, caso exista.
import os
current_filename = "c:\\temp\\oldfile.dat"
new_filename = "c:\\temp\\old_file_renamed.dat"
if os.path.exists(new_filename):
os.remove(new_filename)
os.rename(current_filename, new_filename)
No código acima:
- Defino uma variável com o nome atual do arquivo (current_filename);
- Outra variável com o novo nome do arquivo (new_filename);
- Verifico se já existe um arquivo com o nome que eu desejo utilizar (os.path.exists(new_filename);
- Se existir, utilizo a função remove para apagar este arquivo;
- Por último, utilizo a função rename para renomear o arquivo desejado;
É uma abordagem simples, que não exige a utilização de pacotes extras e que não adiciona tanto código assim. Dependendo do caso, você pode fazer uma função recursiva para gerar um backup do arquivo que já está com o novo nome. Tudo vai depender da sua aplicação.
Utilizando o pacote shutil
from shutil import move
current_filename = "c:\\temp\\oldfile.dat"
new_filename = "c:\\temp\\old_file_renamed.dat"
move(current_filename, new_filename)
No código acima, utilizo a função move do pacote shutil. Por padrão, ele substitui o arquivo destino, caso ele já exista.
Esta é uma forma ainda mais simples que a anterior, mas te da menos controle sobre o que está acontecendo. Com esta abordagem, você não consegue fazer um backup do arquivo, caso já exista algum com o nome que você deseja utilizar.
Independente da abordagem que você vai escolher, cuidado para não substituir um arquivo importante!
Espero ter ajudado!