Como renomear um arquivo usando Python

359

Eu quero mudar a.txtpara b.kml.

zjm1126
fonte

Respostas:

578

Use os.rename:

import os

os.rename('a.txt', 'b.kml')
VOCÊ
fonte
52
Deve-se notar que, se os arquivos não estiverem no diretório ativo, você precisará do caminho completo.
precisa
realmente não, no 3.7 ubuntu, funciona para mim usando caminhos relativos
toing_toing 28/02/19
2
@toing_toing é claro que funciona, ele provavelmente significa apenas que você deve estar ciente do diretório atual e especificar o caminho relativo a ele ou apenas usar o caminho absoluto (como C:/folder/file.txtno Windows ou /home/file.txtno Linux / MacOS).
Alex P.
Vale a pena notar que isso substituirá silenciosamente arquivos em sistemas semelhantes ao Unix, mas falhará OSErrornos sistemas Windows. os.path.existsdeve ser usado para verificar se o destino existe antes de renomear. Isso cria um erro "Hora da verificação até a hora do uso", mas é improvável que cause problemas. (Eu não conheço nenhuma maneira fácil de contornar isso - veja aqui .
AnnanFay
2
Se o usuário realmente deseja que o arquivo seja substituído em qualquer sistema operacional, deve-se usaros.replace
LucG
73

O arquivo pode estar dentro de um diretório; nesse caso, especifique o caminho:

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
Abdul Razak
fonte
50
import shutil

shutil.move('a.txt', 'b.kml')

Isso funcionará para renomear ou mover um arquivo.

Andy Balaam
fonte
32
shutil.movenão é uma boa opção devido a não ser uma operação atômica. Se o arquivo estiver aberto, por exemplo, shutil.movecriará um arquivo com new_name, mas não excluirá o arquivo old_name, deixando-o com dois arquivos. os.renamepor outro lado, não fará nada, o que é uma opção melhor . Com shutil.move, mesmo que você tenha detectado o erro, ainda precisará se preocupar em verificar e excluir o arquivo não autorizado. Só não vale a pena quando existe uma ferramenta melhor:os.rename .
Mvbentes
34

A partir do Python 3.4, pode-se usar o módulo pathlib para resolver isso.

Se você estiver em uma versão mais antiga, poderá usar a versão suportada encontrada aqui

Vamos supor que você não esteja no caminho raiz (apenas para adicionar um pouco de dificuldade) que deseja renomear e tenha que fornecer um caminho completo, podemos observar isso:

some_path = 'a/b/c/the_file.extension'

Portanto, você pode seguir seu caminho e criar um Pathobjeto a partir dele:

from pathlib import Path
p = Path(some_path)

Apenas para fornecer algumas informações sobre esse objeto que temos agora, podemos extrair coisas dele. Por exemplo, se por qualquer motivo desejamos renomear o arquivo modificando o nome do arquivo de the_filepara the_file_1, podemos obter a parte do nome do arquivo:

name_without_extension = p.stem

E ainda segure a extensão na mão também:

ext = p.suffix

Podemos realizar nossa modificação com uma simples manipulação de string:

Python 3.6 e superior fazem uso de strings f!

new_file_name = f"{name_without_extension}_1"

De outra forma:

new_file_name = "{}_{}".format(name_without_extension, 1)

E agora podemos executar nossa renomeação chamando o renamemétodo no objeto de caminho que criamos e anexando o extpara completar a estrutura de renomeação adequada que queremos:

p.rename(Path(p.parent, new_file_name + ext))

Mais em breve para mostrar sua simplicidade:

Python 3.6+:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

Versões menores que Python 3.6 usam o método de formato de string:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
idjaw
fonte
3
Por que você faria isso em vez da resposta aceita? Parece muito mais complicado
rbennell
19
Bem, @rbennell, a maior parte desta resposta é uma explicação. A resposta é realmente apenas as três linhas no final. Além disso, a resposta aceita é feita explicitamente para essa mesma alteração de nome. Esta resposta fornece uma maneira de mostrar como você pode manipular o nome do arquivo para preservar as partes desejadas no caminho ou no nome do arquivo. Além disso, a pathlibbiblioteca é introduzida no python 3.4, portanto, compartilhar a resposta aqui também oferece exposição a um módulo sólido para mostrar sua versatilidade e uso para requisitos mais complicados.
Idjaw
4
Obrigado @idjaw, seu comentário é uma boa resposta para uma pergunta básica de nós iniciantes, um simples Por que você fez isso? . Além disso, é revigorante ver uma abordagem não hostil na Internet do que é frequentemente considerado ignorante.
Igor V.
3
@SasukeUchiha - {}São para formatação de strings, sobre as quais você pode ler aqui . Por fim, o que está acontecendo é que eles {}são substituídos pelas variáveis ​​que são passadas para o formatmétodo. Assim, o primeiro {}retém o que está dentro name_without_extensione o segundo retém o segundo argumento que é simplesmente 1.
Idjaw 5/05
3
O uso de strings f simplifica ainda mais. from pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius
8

Use os.rename. Mas você precisa passar o caminho completo dos dois arquivos para a função. Se eu tiver um arquivo a.txtna minha área de trabalho, então o farei e também tenho que fornecer também um arquivo renomeado.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
Lobo solitário
fonte
11
"Ter que" não é verdade. Você sempre pode substituir um nome de arquivo relativo por um nome de arquivo absoluto e vice-versa. O que geralmente incomoda os iniciantes é que eles não entendem como os nomes de arquivos relativos se relacionam com o diretório de trabalho atual.
tripleee
3
import os

# Set the path
path = 'a\\b\\c'  
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in 
os.chdir(saved_cwd)
Tilak M Divakar
fonte
11
Desconfie de fazê-lo desta maneira. Você nem sempre pode acessar chdir()um diretório, por exemplo, o que acontece no Windows quando é um UNC? E fazer um chdir()tem efeitos colaterais. Prefiro apenas especificar os caminhos necessários para os.rename()diretamente, nada chdir().
22818 JonBrave
0

Você pode usar o os.system para chamar o terminal para realizar a tarefa:

os.system('mv oldfile newfile')

fonte
sim, isso funcionará apenas em uma máquina baseada em unix, como mvé um programa de linha de comando embutido no unix, para mover / renomear um arquivo.
22816 Mikhail Geyer
9
Por que você invocaria um terminal e definiria um comando somente UNIX quando é possível fazê-lo a partir do python de uma maneira multiplataforma?
precisa
0
import os
import re
from pathlib import Path

for f in os.listdir(training_data_dir2):
  for file in os.listdir( training_data_dir2 + '/' + f):
    oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
    newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
    p=oldfile
    p.rename(newfile)
issam
fonte
11
A barra de codificação direta como separador de caminho e a mistura do estilo antigo os.pathcom o moderno pathlibsão bastante duvidosas. Vá até o fim com o pathliblugar.
tripleee
0
import shutil
import os

files = os.listdir("./pics/") 

for key in range(0, len(files)):
   print files[key]
   shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")

Isso deve servir. python 3+

Naveen
fonte
... ou use enumerar para uma versão um pouco mais legível: para chave, fname em enumerar (arquivos):…
Nicolas D