Python >> Tutoriel Python >  >> Python

Comment renommer des fichiers Python

Combien de temps passez-vous à renommer vos fichiers ? Vous vous demandez si vous pourriez le faire plus rapidement et facilement ? Et si vous pouviez renommer un grand nombre de fichiers en un clin d'œil ? Python est livré avec plusieurs modules et fonctions intégrés pour faire exactement cela. Dans cet article, vous apprendrez à utiliser bon nombre de ces modules et fonctions pour renommer et déplacer des fichiers en Python.

Photo de Chris Ried - source :unsplash

Python est un langage de programmation puissant. Il est facile à apprendre en raison de sa syntaxe simple et il est également polyvalent. Vous pouvez presque tout faire avec, ce qui explique sa grande popularité.

Même si vous n'êtes pas un développeur professionnel, vous pouvez améliorer votre productivité quotidienne avec quelques lignes de code Python . Je respecte le concept de « paresse intelligente ». Si vous devez faire quelque chose plus de trois fois, écrivez un script et évitez les tracas !

Je trouve intéressant de passer du temps au début à automatiser des tâches que je devrai effectuer souvent pour gagner du temps au final. Cela m'aide également à améliorer mes compétences en résolution de problèmes. L'une de ces tâches consiste à renommer et déplacer des lots de fichiers .

Si vous ne savez pas comment faire cela, ou si ce que je viens de dire ressemble à une bataille difficile, n'ayez crainte. Chez LearnPython.com, nous sommes là pour vous ! Dans cet article, je vais vous montrer comment déplacer et renommer des fichiers en Python.

Sans plus tarder, allons-y ! Pour m'assurer que nous sommes sur la même page, j'utilise Windows 10 et Python 3.8.5 . C'est aussi une bonne idée mais pas obligatoire d'avoir une certaine compréhension de la manipulation de chaînes avec Python.

Manipulations essentielles des fichiers et des répertoires

Pour nous échauffer, effectuons quelques manipulations essentielles à l'aide du module os. Cela permettra de comprendre plus facilement comment renommer des fichiers en Python ultérieurement.

Le module os permet aux scripts d'interagir directement avec le système d'exploitation. Il fait partie du package d'utilitaires intégrés standard de Python et aucune installation n'est requise.

Écrivons du code pour changer de répertoire avec os.chdir() et afficher celui en cours avec os.getcwd() .

# import os module
import os

# change directory
os.chdir('c:\\MyDirectory')

# display the current directory
cwd = os.getcwd()

# display directory content
print("current working directory:", cwd)

Et voici le résultat :

Pour exécuter un script, ouvrez votre terminal Python et exécutez :

python your_scriptname.py

Si vous êtes curieux, vous pouvez en savoir plus sur os.chdir() ici et os.getcwd() ici.

Lorsque vous explorez un nouveau concept, une nouvelle bibliothèque ou un nouveau framework, il est toujours judicieux de lire la documentation officielle.

Renommer des fichiers en Python avec os.rename()

Maintenant que nous avons couvert quelques notions de base, appliquons le rename méthode du module os pour renommer les fichiers en Python. Pour renommer un seul fichier, nous devons entrer le nom actuel du fichier avec son emplacement actuel et son nouveau nom avec sa destination.

Exécutons un exemple. Pour ce tutoriel, j'ai rassemblé quelques photos d'archives que nous allons renommer en Python. Voici mon premier dossier de photos.

Tout d'abord, nous allons renommer cette belle image d'un ciel rouge. Comme vous pouvez le voir, le nom du fichier n'est pas très lisible. Renommez-le red_sky.jpg .

Pour commencer, nous pouvons obtenir le nom, le type et l'emplacement du fichier avec des propriétés. Nous verrons plus tard que nous pouvons utiliser Python pour obtenir les noms de fichiers dans notre répertoire. Mais restons simples pour l'instant.

Voici notre script :

# import os module
import os

# state file origin and destination as
# os.rename(source, destination)
os.rename(r'C:\py_scripts\photos\abhijeet-gaikwad-bokneofJXeI-unsplash.jpg', r'C:\py_scripts\photos\red_sky.jpg')
print("success")

Une chaîne brute Python est une chaîne normale précédée de la lettre r. Il traite les caractères comme des barres obliques inverses comme des caractères normaux et non comme des caractères d'échappement. Cela garantit l'exactitude du chemin afin que nous puissions déplacer et renommer les fichiers en Python sous Windows.

De plus, le dernier caractère ne peut pas être une barre oblique inverse car cela générerait une erreur de syntaxe.

Exécutons notre script et vérifions le résultat :

Notre fichier a été renommé avec succès ! Vous pouvez trouver plus d'informations sur os.rename() ici ainsi que dans notre cours sur l'utilisation des fichiers et des répertoires en Python.

Maintenant que nous comprenons le mécanisme derrière le processus de renommer un fichier en Python , il est important de noter que renommer revient à déplacer et vice-versa.

Toutefois, si les emplacements source et cible se trouvent sur des partitions, des lecteurs ou des périphériques différents, os.rename() ne fonctionnera pas. Si tel est le cas, utilisez shutil.move() à la place.

Déplacer des fichiers en Python avec shutdown.move()

Le clos fait également partie du module utilitaire standard de Python. Par conséquent, il n'a pas besoin d'être installé.

Shutil aide à automatiser le processus de copie et de suppression de fichiers et/ou de répertoires. Avec shutil.move() , il est possible non seulement de renommer un fichier mais aussi de changer le répertoire du fichier.

Utilisons l'image que nous avons renommée red_sky.jpg . Nous allons le déplacer dans un nouveau dossier appelé awesome et renommer l'image awesome_sky.jpg . Êtes-vous prêt ?

Ceci est une capture d'écran de mon répertoire de photos avant d'exécuter notre script.

Écrivons notre scénario. Nous devons importer le shutil module et indiquez le chemin initial du fichier et sa destination. Pour rendre le code plus lisible, j'ai assigné le chemin initial à une variable appelée src et le chemin de destination vers dst .

Enfin, nous appelons le move méthode du module shutdown.

# import shutil
import shutil

# file source and destination
src=r'C:\py_scripts\photos\red_sky.jpg'
dst=r'C:\py_scripts\photos\awesome\awesome_sky.jpg'

# change file directory and rename file as awesome_sky
shutil.move(src, dst)

Comme nous l'avons fait précédemment, vous pouvez maintenant exécuter le script dans votre terminal python. Voici le résultat final.

Vous pouvez voir que nous avons réussi à déplacer notre fichier vers le répertoire awesome et l'avons renommé awesome_sky.jpg . Ainsi, dans cet exemple, nous avons appris à renommer et à déplacer des fichiers en Python.

Génial, n'est-ce pas ?

Lorsque vous utilisez shutil.move() , une copie du fichier est créée dans le chemin de destination et l'original est supprimé.

shutil.move() , contrairement à os.rename() gérera différents périphériques, disques ou partitions. Dans un tel cas, shutil.move() copiera d'abord le fichier, puis le supprimera de son emplacement d'origine.

Si vous ne souhaitez pas modifier le nom du fichier, vous n'avez pas besoin de le passer comme paramètre de destination. Par exemple :

shutil.move("my_file.txt", "new_directory")  

Vous pouvez en savoir plus sur shutil.move() ici. N'hésitez pas non plus à consulter notre cours sur l'utilisation de fichiers et de répertoires en Python.

Déplacer des fichiers en Python avec shutdown.copy()

Nous pouvons également utiliser shutil.copy() pour copier un fichier d'un répertoire à un autre. Contrairement à shutil.move() , shutil.copy() ne supprimera pas le fichier de son emplacement d'origine.

Dans cet exemple, j'ai une image appelée photo_https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg que je veux copier dans un dossier appelé data1 comme on le voit ici :

Écrivons un script en utilisant shutil.copy() pour effectuer cette tâche.

# import
import shutil

# state source and destination folder
src = r'C:\py_scripts\photos\photo_https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg'
dst = r'C:\py_scripts\photos\data1'

# copy src to dst
shutil.copy(src, dst)

Et voici le résultat :

Notre photo_https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg le fichier est toujours dans notre répertoire source, et notre script a créé une copie du même fichier dans notre data1 dossier.

shutil.copy() nous fournit un moyen de déplacer des fichiers en Python sans avoir à les supprimer de leurs répertoires d'origine. Vous pouvez en savoir plus à ce sujet dans la documentation ici ainsi que dans notre cours sur l'utilisation des fichiers et des répertoires en Python.

Renommer des fichiers en Python avec Pathlib's Path.rename()

Python pathlib est un framework orienté objet pour gérer les chemins du système de fichiers. Si vous vous demandez comment choisir entre pathlib et le module os, il existe quelques différences clés.

Le module os utilise une représentation sous forme de chaîne de chemins tandis que pathlib crée un objet du répertoire. L'utilisation de pathlib permet une meilleure lisibilité et maintenabilité du code, ainsi qu'une portabilité vers différents systèmes d'exploitation.

Renommez un fichier avec pathlib . Dans cet exemple, nous allons prendre une nouvelle image et la renommer en utilisant pathlib . Comme vous pouvez le voir, le nom de notre image n'est pas très lisible pour le moment.

Alors, écrivons notre script. Pathlib a une manière propre et intuitive de construire des chemins, que nous pouvons écrire comme :

Path.cwd() / 'sub directory' / 'filename'

Une fois le chemin de notre fichier courant défini avec le Path classe, nous utilisons alors le rename méthode avec le nouveau chemin et le nom du fichier comme argument.

Voici le code :

# import Path class from pathlib
from pathlib import Path

# define file path that we want to rename
filepath = Path.cwd() / 'photos' / 'diego-ph-5LOhydOtTKU-unsplash.jpg'

# rename file
filepath.rename(Path.cwd() / 'photos' / 'shooting_star.jpg')

Voir le résultat ci-dessous.

Notre nom de fichier est maintenant shooting_star.jpg . Vous pouvez en savoir plus sur la bibliothèque de pathlib pour renommer les fichiers en Python ici ainsi que dans notre cours sur l'utilisation des fichiers et des répertoires en Python.

Renommer des fichiers par lots en Python avec os.rename() et os.listdir()

On peut renommer les fichiers un par un, mais cela peut devenir fastidieux et/ou impossible si on a beaucoup de fichiers. Imaginez que vous deviez préparer un jeu de données avec des milliers d'images pour former un modèle de vision par ordinateur. Ce n'est tout simplement pas faisable à la main.

Au lieu de cela, nous pouvons renommer les fichiers par lots en Python. Choisissons un dossier avec des centaines d'images à renommer en utilisant Python pour automatiser cette tâche pour nous.

Encore une fois, nous utiliserons os.rename() . Cependant, cette fois, nous devrons écrire une fonction pour parcourir le répertoire et renommer les fichiers les uns après les autres. N'oubliez pas d'ajouter le chemin du dossier dans la destination.

Nous utiliserons le os.path.join() méthode. Le premier paramètre est le path_name , et le deuxième paramètre est le nom du fichier. Cela rend le code plus lisible et plus propre. Cela facilite également la réutilisation du même code sur un système d'exploitation différent.

Modifiez simplement la variable path_name. Dans le dst variable, le deuxième paramètre est le nouveau nom de fichier. J'ai attribué le nouveau format de fichier à une variable appelée new .

Le enumerate() renverra une collection en tant qu'objet et ajoutera un compteur en tant que clé de l'objet.

# import os module
import os

# folder path and destination
path_name = r'C:\py_scripts\photos\data'

# loop through the directory to rename all the files
for count, filename in enumerate(os.listdir(path_name)):
        new ="pic-" + str(count) + '.jpg'  # new file name
        src = os.path.join(path_name, filename)  # file source
        dst = os.path.join(path_name, new)  # file destination
        # rename all the file
        os.rename(src, dst)

Vérifions les résultats :

Nos photos ont été renommées avec succès. Si vous souhaitez en savoir plus sur os.listdir() , vous pouvez consulter la documentation ici ainsi que notre cours sur l'utilisation des fichiers et des répertoires en Python.

Renommer des fichiers par lots en Python avec os.scandir()

Nous pouvons renommer plusieurs fichiers en utilisant os.scandir() au lieu de os.listdir(). os.scandir() est beaucoup plus rapide car il obtient un itérateur du os.DirEntry objets.

Écrivons du code. Nous allons utiliser un dossier appelé data1 avec plusieurs photos. Cette fois, nous allons renommer nos fichiers avec img comme préfixe.

# import os module
import os

# folder path
path = r'C:\py_scripts\photos\data1'

# set counter
count = 1
for f in os.scandir(path):
    if str(f.name).endswith('.jpg'):
        new_file = 'img-' + str(count)+'.jpg'
        src = os.path.join(path, f.name)
        dst = os.path.join(path, new_file)
        os.rename(src, dst)
        count += 1

# close iterator to free some resources
os.scandir(path).close()

Ici, contrairement à l'extrait précédent, j'ai ajouté une instruction conditionnelle pour vérifier si le fichier a le .jpg extension. Dans ce cas, seuls les fichiers avec le .jpg l'extension de fichier sera renommée.

N'oubliez pas de fermer le os.scandir() itérateur à la fin pour libérer des ressources et rendre votre code plus efficace.

Comme vous pouvez le voir, nous venons de renommer notre dossier data1 en utilisant os.scandir() méthode :

Vous pouvez en savoir plus sur la façon de renommer par lots des fichiers en Python avec os.scandir() ici ainsi que dans notre cours sur l'utilisation des fichiers et des répertoires en Python.

Renommer des fichiers par lots en Python avec Pathlib's Path.iterdir()

Nous pouvons également renommer par lots des fichiers en Python avec le Path.iterdir() de pathlib . Similaire à os.scandir() , Path.iterdir() est plus rapide que os.listdir() .

Cette fois, j'ai un dossier appelé data1 avec des images appelées photo_https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg , photo_2.jpg ,... Je veux les renommer en img-https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg , img-2.jpg ,...

Écrivons le script pour les renommer tous.

# import
from pathlib import Path

# set the directory
path = Path.cwd() / 'photos' / 'data1'

# set a counter
counter = 1

# loop through the directory and rename the files
for file in path.iterdir():
    if file.is_file():
        new_file = "img-" + str(counter) + file.suffix
        file.rename(path / new_file)
        counter += 1

Et voici le résultat :

Il est recommandé d'utiliser os.scandir() ou Path.iterdir() de pathlib car ces méthodes sont plus performantes, en particulier dans les dossiers contenant un grand nombre de fichiers. En règle générale, il est toujours recommandé d'écrire un code efficace car cela permet d'économiser du temps et des ressources.

Vous pouvez en savoir plus sur la façon de renommer par lots des fichiers en Python avec le Path.iterdir() de pathlib ici ainsi que dans notre cours sur l'utilisation des fichiers et des répertoires en Python.

Renommer les fichiers par lots de manière séquentielle en Python

Les méthodes précédentes sont efficaces pour renommer les fichiers, mais elles ne trient pas les fichiers pour les maintenir en ordre. Pour garder les fichiers en ordre, nous pouvons les trier par date de dernière modification en utilisant os.path.getmtime(x) . On peut alors renommer les fichiers en fonction de leur heure de modification et ajouter un numéro séquentiel au nom du fichier avec zfill() .

Écrivons du code pour renommer séquentiellement nos fichiers à partir d'un dossier nommé data. Nous voulons les renommer photo-0https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg , photo-02.jpg , etc.

# import os module
import os

# directory path
path_name = r'C:\py_scripts\photos\data'

# Sort list of files based on last modification time in ascending order using list comprehension
name_list = os.listdir(path_name)
full_list = [os.path.join(path_name,i) for i in name_list]
sorted_list = sorted(full_list, key=lambda x: os.path.getmtime(x))

# initiate counter
count = 0

# loop through files and rename
for file in sorted_list:
    # print(file)
    prefix = "photo-"
    counter = str(count).zfill(2)
    new = prefix + counter + '.jpg'  # new file name
    src = os.path.join(path_name, file)  # file source
    dst = os.path.join(path_name, new)  # file destination
    os.rename(src, dst)
    count +=1

Voici le résultat final :

Renommer des fichiers par lots en Python avec glob.glob() et glob.iglob()

En Python, on peut aussi utiliser le glob module pour récupérer les fichiers et les noms de chemin correspondant à un modèle prédéterminé. Utilisation de glob patterns est plus rapide que les autres méthodes pour faire correspondre les noms de chemin dans les répertoires.

Semblable aux modules précédents de cet article, il est intégré à Python, nous n'avons donc rien à installer.

Nous pouvons utiliser glob.glob() ou glob.iglob() pour récupérer les chemins de manière récursive à l'intérieur des répertoires et sous-répertoires. Contrairement au glob.glob() méthode, le glob.iglob() renvoie un itérateur, ce qui signifie que toutes les valeurs ne sont pas stockées en mémoire, ce qui offre plus d'efficacité.

Enfin, nous pouvons terminer l'opération avec os.rename() pour renommer nos fichiers.

Un modèle récursif est une séquence d'instructions qui revient au début de lui-même jusqu'à ce qu'il détecte qu'une condition a été satisfaite (comme atteindre la fin de ce qui doit être traité).

Avant d'aller plus loin, une mise en garde. Si vous décidez d'utiliser un modèle récursif, soyez très prudent . Vous devez définir correctement le cas de base , sinon, il peut se transformer en une boucle infinie, et la fonction récursive continuera à s'appeler pour toujours.

Vous pouvez probablement imaginer les dégâts si votre code renommait vos fichiers pour toujours, un répertoire après l'autre... Si vous voulez explorer cela, définissez un environnement virtuel et regardez votre système d'exploitation s'effondrer.

Les modèles récursifs sont puissants mais doivent être liés par un cas de base .

Dans cet exemple, nous allons travailler sur un dossier nommé data1 , qui contient beaucoup d'images. Nous voulons tous les renommer. Tout d'abord, vérifions que nous avons sélectionné les bons fichiers en affichant les noms de fichiers.

# import glob
import glob

# glob.glob() returns a list of file names
print("Using glob.glob()")
files = glob.glob(r'C:\py_scripts\photos\data1\**\*.jpg', recursive = True)
for file in files:
    print(file)

# glob.iglob() returns an iterator
print("\nUsing glob.iglob()")
for f in glob.iglob('C:\py_scripts\photos\data1\**\*.jpg', recursive = True):
    print(f)

Voici notre sortie en utilisant glob.glob() :

Et voici notre sortie en utilisant glob.iglob() :

Notre code a correctement identifié les images à renommer. Alors, renommons nos images. Avec glob.glob() , vous pouvez utiliser le code suivant :

# import
import os
import glob

# path
path = r'C:\py_scripts\photos\data1'
path_name = r'C:\py_scripts\photos\data1\**\*.jpg'
# set counter
counter = 1

for f in glob.glob(path_name, recursive = True):
    #print(f)
    new =  "Pic_" + str(counter).zfill(5) + ".jpg"
    dst = os.path.join(path, new)
    os.rename(f, dst)
    counter +=1

Le zfill() de la chaîne renommera les images avec cinq chiffres :Pic_0000https://python.19633.com/article/uploadfiles/202208/2022080110021403.jpg , Pic_00002.jpg , etc. N'hésitez pas à modifier le nombre de chiffres selon vos besoins.

Voici le résultat final :

Si vous préférez glob.iglob() , vous pouvez utiliser les éléments suivants :

# import
import os
import glob

# path
path = r'C:\py_scripts\photos\data1'
path_name = r'C:\py_scripts\photos\data1\**\*.jpg'
# set counter
counter = 1
# glob.iglob() returns an iterator

for f in glob.iglob(path_name, recursive = True):
    #print(f)
    new = "Picture_" + str(counter) + ".jpg"
    dst = os.path.join(path, new)
    os.rename(f, dst)
    counter +=1

Voici le résultat final :

Vous pouvez trouver plus d'informations sur glob.glob() ici et glob.iglob() ici. N'oubliez pas de consulter également notre cours sur l'utilisation de fichiers et de répertoires en Python.

Renommer des fichiers par lots en Python avec os.walk(cwd)

Rendons cela un peu plus difficile. Nous pouvons également obtenir des fichiers à partir de répertoires imbriqués, les renommer et les déplacer vers un seul répertoire. Faisons cela avec os.walk(cwd) .

os.walk() génère les noms de fichiers dans une arborescence de répertoires en parcourant l'arborescence de haut en bas ou de bas en haut. Ensuite, il donne un tuple de trois éléments (dir_path , dir_names , file_names ).

Cette fois, j'ai des images dans 2 dossiers différents appelés data1 et data2 . Je veux les renommer et les déplacer tous dans un dossier différent appelé all .

Voici mon data1 dossier :

Et voici mon data2 dossier :

Écrivons du code :

# import
import os

# define current working directory
cwd = 'C:\py_scripts\photos'
count = 1
for dir_path, dir_names, file_names in os.walk(cwd):
    for f in file_names:
        if f.endswith('.jpg'):
            new = 'pic_' + str(count) + '.jpg'
            dest_dir = os.path.join(cwd,'all')
            # create new directory if does not exist
            if not os.path.isdir(dest_dir):
                os.mkdir(dest_dir)
            os.rename(os.path.join(dir_path, f), os.path.join(dest_dir, new))
            count += 1

Voici le résultat :

Donc, notre data1 et data2 les dossiers sont maintenant vides et nos images ont été renommées et déplacées dans le dossier all.

Vous pouvez en savoir plus sur os.walk() ici. Vous pouvez également consulter notre cours sur l'utilisation de fichiers et de répertoires en Python.

Réflexions finales

Nous avons couvert beaucoup de terrain dans cet article! Nous avons appris plusieurs façons de :

  • Renommer des fichiers en Python
  • Déplacer des fichiers en Python
  • Renommer des fichiers par lots en Python
  • Déplacer des fichiers par lots en Python

N'hésitez pas à réutiliser le code ci-dessus pour vous aider à démarrer. Jouez avec le code et commencez à automatiser certaines de vos tâches récurrentes avec Python.

Pour faire passer vos compétences en programmation Python au niveau supérieur, n'oubliez pas de consulter notre piste de programmation Python et LearnPython.com !