Cómo cambiar el nombre de un archivo usando Python

Respuestas:

578

Uso os.rename:

import os

os.rename('a.txt', 'b.kml')

fuente
52
Debe tenerse en cuenta que si los archivos no están en el directorio de trabajo, necesitará la ruta completa.
EndermanAPM
en realidad no, en 3.7 ubuntu, funciona para mí usando rutas relativas
toing_toing
2
@toing_toing, por supuesto, funciona, probablemente solo quiere decir que debe conocer el directorio actual y especificar la ruta relativa a él, o simplemente usar la ruta absoluta (como C:/folder/file.txten Windows o /home/file.txten Linux / MacOS).
Alex P.
Vale la pena señalar que esto sobrescribirá silenciosamente los archivos en sistemas similares a Unix, pero fallará OSErroren los sistemas Windows. os.path.existsdebe usarse para verificar si el objetivo existe antes de renombrarlo. Esto crea un error de "Tiempo de verificación a tiempo de uso", pero es poco probable que cause problemas. (No conozco una manera fácil de evitar esto - ver aquí .
AnnanFay
2
Si el usuario realmente quiere que el archivo sea reemplazado en cualquier sistema operativo, se debe usaros.replace
LucG
74

El archivo puede estar dentro de un directorio, en ese caso, especifique la ruta:

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
fuente
50
import shutil

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

Esto funcionará para cambiar el nombre o mover un archivo.

Andy Balaam
fuente
32
shutil.moveNo es una buena opción por no ser una operación atómica. Si el archivo está abierto, por ejemplo, shutil.movecreará un archivo con new_name, pero no lo eliminará y, old_namepor lo tanto, le dejará dos archivos. os.renamepor otro lado no hará nada, lo cual es una mejor opción . Con shutil.move, incluso si detecta el error, aún tendrá que preocuparse por verificar y eliminar el archivo falso. Simplemente no vale la pena cuando existe una mejor herramienta:os.rename .
mvbentes
34

A partir de Python 3.4 se puede usar el módulo pathlib para resolver esto.

Si tiene una versión anterior, puede usar la versión con respaldo que se encuentra aquí

Supongamos que no está en la ruta raíz (solo para agregarle un poco de dificultad) a la que desea cambiar el nombre, y tiene que proporcionar una ruta completa, podemos ver esto:

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

Entonces, puedes tomar tu camino y crear un Pathobjeto a partir de él:

from pathlib import Path
p = Path(some_path)

Solo para proporcionar información sobre este objeto que tenemos ahora, podemos extraer cosas de él. Por ejemplo, si por cualquier razón queremos cambiar el nombre del archivo modificando el nombre de archivo de the_filea the_file_1, entonces podemos obtener la parte del nombre de archivo:

name_without_extension = p.stem

Y todavía sostenga la extensión en la mano también:

ext = p.suffix

Podemos realizar nuestra modificación con una simple manipulación de cadenas:

¡Python 3.6 y superior hacen uso de cadenas f!

new_file_name = f"{name_without_extension}_1"

De otra manera:

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

Y ahora podemos realizar nuestro cambio de nombre llamando al renamemétodo en el objeto de ruta que creamos y agregando el extpara completar la estructura de cambio de nombre que queremos:

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

Más brevemente para mostrar su simplicidad:

Python 3.6+:

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

Las versiones inferiores a Python 3.6 utilizan el método de formato de cadena en su lugar:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
idjaw
fuente
3
¿Por qué harías esto en lugar de la respuesta aceptada? Parece mucho más complicado
rbennell
19
Bueno @rbennell, la mayor parte de esta respuesta es una explicación. La respuesta es realmente solo las tres líneas al final. Además, la respuesta aceptada se hace explícitamente para ese mismo cambio de nombre. Esta respuesta proporciona una manera de mostrar cómo puede manipular el nombre del archivo para preservar las partes que desea en la ruta o el nombre del archivo. Además, la pathlibbiblioteca se presenta en python 3.4, por lo que compartir la respuesta aquí también proporciona exposición para un módulo sólido que muestre su versatilidad y uso para requisitos más complicados.
idjaw
44
Gracias @idjaw, tu comentario es una buena respuesta a una pregunta básica de nosotros los principiantes, un simple ¿Por qué hiciste eso? . Además, es refrescante ver un enfoque no hostil en Internet a lo que a menudo se considera ignorante.
Igor V.
3
@SasukeUchiha: {}son para el formato de cadenas, que puedes leer aquí . En última instancia, lo que está sucediendo es que {}se reemplazan con las variables que se pasan al formatmétodo. Entonces, el primero {}contendrá lo que está adentro name_without_extension, y el segundo contendrá el segundo argumento, que es simplemente 1.
idjaw
3
Usar f-strings lo simplifica aún más. from pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius
8

Uso os.rename. Pero debe pasar la ruta completa de ambos archivos a la función. Si tengo un archivo a.txten mi escritorio, lo haré y también tengo que dar el archivo lleno de nombre.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
Lobo solitario
fuente
1
"Tener que" no es cierto. Siempre puede sustituir un nombre de archivo relativo por un nombre de archivo absoluto, y viceversa. Lo que generalmente muerde a los principiantes es que no entienden cómo se relacionan los nombres de archivo relativos con el directorio de trabajo actual.
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
fuente
1
Tenga cuidado de hacerlo de esta manera. No siempre se puede acceder chdir()a un directorio, por ejemplo, ¿qué sucede en Windows cuando se trata de un UNC? Y hacer un chdir()tiene efectos secundarios. Prefiero simplemente especificar las rutas necesarias para os.rename()directamente, no chdir()ing.
JonBrave
0

Puede usar os.system para invocar el terminal para realizar la tarea:

os.system('mv oldfile newfile')

fuente
Sí, esto funcionará solo en una máquina basada en Unix, ya que mves un programa de línea de comandos incorporado de Unix para mover / renombrar un archivo.
Mikhail Geyer
99
¿Por qué invocaría un terminal y definiría un comando solo para UNIX cuando puede hacerlo desde python de una manera multiplataforma?
EndermanAPM
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
fuente
1
La barra diagonal de codificación rígida como el separador de ruta y la mezcla de estilo antiguo os.pathcon moderno pathlibes bastante dudoso. Ir todo el camino con en su 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")

Esto debería hacerlo. python 3+

Naveen
fuente
... o use enumerate para una versión ligeramente más legible: para key, fname en enumerate (archivos): ...
Nicolas D