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!
Latest posts by Breno RdV (see all)
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022
- Ordenando um DataFrame por múltiplas colunas. (#python #pandas #jupyter #dev #data) - agosto 3, 2022