Python | A poderosa função os.rename(src, dst)

Recentemente desenvolvi um script com as funções de renomear determinados arquivos e move-los para backup. Durante o desenvolvimento descobri algumas coisas interessantes, até pelo fato de não ser um expert em python.

Pré-requisitos

  • Python 2.5
  • Windows XP

Problema

Ao terminar de escrever o script tentei rodar o mesmo e apareceu a seguinte singela mensagem.

#Erro WindowsError: [Error 2] O sistema não pode encontrar o arquivo especificado

Solução

Para resolver este problema no Windows foi necessário adicionar o diretório ao nome do arquivo.

Exemplo:

os.rename(‘C:nome_do_diretorio’ + oldname, ‘C:nome_do_diretorio’ + newname)

Descoberta

Durante este processo de renomear o arquivo coloquei um diretório diferente para o novo nome do arquivo.

Exemplo:

os.rename(‘C:nome_do_diretorio’ + oldname, ‘C:diretorio_diferente’ + newname)

Para minha surpresa a função Rename() renomeu o arquivo e o MOVEU para o diretório definido.

Estudando um pouco mais sobre a função rename descobri que na realidade ela implementa a função MoveFile() dentro de si a qual permite mover os arquivos.

Indo mais profundamente no assunto, encontrei um patche criado por Raghuram Devarakonda para resolver o problema com o windows . Embora o patche tenha gerado uma “discussão” em torno desta implementação, ela é funcional.

Se desejar utilizar o patche leia na integra todo o assunto: http://bugs.python.org/issue1704547

Função Rename em atividade

Segue o script completo:

#----------------------------------------------------------------------
# Created by: Razec
#----------------------------------------------------------------------
#Esta função altera o nome do arquivo antigo, adicionando a sigla RZC.
#Em seguida adiciona move o arquivo para outro diretório.
#----------------------------------------------------------------------
import os

#Arquivo renomeado.
def renameMoveFiles():
 #Local que contém os arquivos a serem alterados.
 filename = 'C:temp'
 movefilename = 'C:temptest'
 #Lista todos os arquivos do diretório.
 for oldname in os.listdir(filename):
 #Adiciona RZC_ no nome do arquivo.
 newname = 'RZC_' + oldname
 #Adiciona o diretório ao arquivo.
 oldname = os.path.join(filename, oldname)
 #Esta definido outro diretório para observar o arquivo sendo renomeado e movido para outro local
 newname = os.path.join(movefilename, newname)
 #Renomeia todos arquivos
 os.rename(oldname, newname)

 print("Renamed")

#---MAIN---
def main():
 #Chama a função acima.
 renameMoveFiles()
if __name__ == "__main__":
 main()

Bons testes e novas descobertas fique a vontade para comentar. Documentação: http://docs.python.org/library/os.html


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s