Sobrescrever arquivos com os.rename. (Python)

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:

  1. Defino uma variável com o nome atual do arquivo (current_filename);
  2. Outra variável com o novo nome do arquivo (new_filename);
  3. Verifico se já existe um arquivo com o nome que eu desejo utilizar (os.path.exists(new_filename);
  4. Se existir, utilizo a função remove para apagar este arquivo;
  5. 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!

 

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , , .