Comment renommer un fichier en utilisant Python

Réponses:

578

Utilisation os.rename:

import os

os.rename('a.txt', 'b.kml')
VOUS
la source
52
Il convient de noter que si les fichiers ne se trouvent pas dans le répertoire de travail, vous aurez besoin du chemin complet.
EndermanAPM
pas vraiment, sur 3.7 ubuntu, fonctionne pour moi en utilisant des chemins relatifs
toing_toing
2
@toing_toing, bien sûr, cela fonctionne, il signifie probablement simplement que vous devez être conscient du répertoire actuel, et soit spécifier le chemin d'accès par rapport à celui-ci, soit simplement utiliser le chemin absolu (comme C:/folder/file.txtsous Windows ou /home/file.txtsous Linux / MacOS).
Alex P.
Il convient de noter que cela écrasera silencieusement les fichiers sur les systèmes de type Unix mais échouera OSErrorsur les systèmes Windows. os.path.existsdoit être utilisé pour vérifier si la cible existe avant de renommer. Cela crée un bogue "Time Of Check to Time Of Use", mais il est peu probable qu'il cause des problèmes. (Je ne connais aucun moyen facile de contourner cela - voir ici .
AnnanFay
2
Si l'utilisateur souhaite réellement que le fichier soit remplacé sur n'importe quel système d'exploitation, il faut utiliseros.replace
LucG
74

Le fichier peut se trouver dans un répertoire, dans ce cas précisez le chemin:

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
la source
50
import shutil

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

Cela fonctionnera pour renommer ou déplacer un fichier.

Andy Balaam
la source
32
shutil.moven'est pas une bonne option car il ne s'agit pas d'une opération atomique. Si le fichier est ouvert, par exemple, shutil.movecréera un fichier avec new_name, mais ne le supprimera pas, old_namevous laissant donc deux fichiers. os.renamed'autre part ne fera rien, ce qui est une meilleure option . Avec shutil.move, même si vous avez détecté l'erreur, vous devrez toujours vous soucier de la vérification et de la suppression du fichier escroc. Tout simplement pas la peine quand un meilleur outil existe:os.rename .
mvbentes
34

Depuis Python 3.4, on peut utiliser le module pathlib pour résoudre ce problème.

S'il vous arrive d'être sur une ancienne version, vous pouvez utiliser la version rétroportée trouvée ici

Supposons que vous ne soyez pas dans le chemin racine (juste pour ajouter un peu de difficulté) que vous souhaitez renommer et que vous deviez fournir un chemin complet, nous pouvons regarder ceci:

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

Vous pouvez donc emprunter votre chemin et en créer un Pathobjet:

from pathlib import Path
p = Path(some_path)

Juste pour fournir quelques informations sur cet objet que nous avons maintenant, nous pouvons en extraire des choses. Par exemple, si pour une raison quelconque nous voulons renommer le fichier en modifiant le nom de fichier de the_fileà the_file_1, alors nous pouvons obtenir la partie nom de fichier:

name_without_extension = p.stem

Et tenez également l'extension en main:

ext = p.suffix

Nous pouvons effectuer notre modification avec une simple manipulation de chaîne:

Python 3.6 et supérieur utilise des chaînes f!

new_file_name = f"{name_without_extension}_1"

Autrement:

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

Et maintenant, nous pouvons effectuer notre changement de nom en appelant la renameméthode sur l'objet chemin que nous avons créé et en l'ajoutant extpour compléter la structure de changement de nom appropriée:

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

Plus brièvement pour montrer sa simplicité:

Python 3.6+:

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

Les versions inférieures à Python 3.6 utilisent à la place la méthode du format de chaîne:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
idjaw
la source
3
Pourquoi feriez-vous cela au lieu de la réponse acceptée?
Cela
19
Eh bien @rbennell, la plupart de cette réponse est une explication. La réponse est vraiment juste les trois lignes à la fin. De plus, la réponse acceptée est faite explicitement pour ce même changement de nom. Cette réponse fournit un moyen de montrer comment vous pouvez manipuler le nom de fichier pour conserver les parties souhaitées dans le chemin ou le nom du fichier. En outre, la pathlibbibliothèque est introduite en python 3.4, donc partager la réponse ici fournit également une exposition pour un module solide pour montrer sa polyvalence et son utilisation pour des exigences plus complexes.
idjaw
4
Merci @idjaw, votre commentaire est une bonne réponse à une question basique de nous débutants, simple Pourquoi avez-vous fait ça? . En outre, il est rafraîchissant de voir une approche non hostile sur Internet à ce qui est souvent considéré comme ignorant.
Igor V.
3
@SasukeUchiha - Les {}sont pour le formatage des chaînes, que vous pouvez lire ici . En fin de compte, ce qui se passe est que le {}get est remplacé par les variables transmises à la formatméthode. Ainsi, le premier {}contiendra ce qui est dedans name_without_extension, et le second contiendra le deuxième argument qui est simplement 1.
idjaw
3
L'utilisation de chaînes f simplifie encore plus. depuis pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius
8

Utilisez os.rename. Mais vous devez passer le chemin complet des deux fichiers à la fonction. Si j'ai un fichier a.txtsur mon bureau, je vais le faire et je dois aussi donner plein de fichiers renommés.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
Loup solitaire
la source
1
"Devoir" n'est pas vrai. Vous pouvez toujours remplacer un nom de fichier relatif par un nom de fichier absolu et vice versa. Ce qui mord habituellement les débutants, c'est qu'ils ne comprennent pas comment les noms de fichiers relatifs sont liés au répertoire de travail actuel.
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
la source
1
Méfiez-vous de le faire de cette façon. Vous ne pouvez pas toujours accéder chdir()à un répertoire, par exemple ce qui se passe sous Windows quand il s'agit d'un UNC? Et faire un chdir()a des effets secondaires. Je préfère simplement spécifier les chemins nécessaires pour os.rename()directement, pas d' chdir()ing.
JonBrave
0

Vous pouvez utiliser os.system pour appeler le terminal pour accomplir la tâche:

os.system('mv oldfile newfile')

la source
oui, cela ne fonctionnera que sur une machine basée sur unix, tout comme mvun programme de ligne de commande intégré à unix pour déplacer / renommer un fichier.
Mikhail Geyer
9
Pourquoi invoquer un terminal et définir une commande UNIX uniquement alors que vous pouvez le faire à partir de python de manière multiplateforme?
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
la source
1
La barre oblique codée en dur comme séparateur de chemin et mélangeant l'ancien os.pathet le moderne pathlibest assez douteuse. Allez jusqu'au bout avec pathlib.
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")

Cela devrait le faire. python 3+

Naveen
la source
... ou utilisez enumerate pour une version légèrement plus lisible: pour clé, fname dans enumerate (fichiers):…
Nicolas D