Sobrescrever arquivos com os.rename. (Python)

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:

  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!