Lecture libre, sans compteChapitre 2 · Manipuler des fichiers et dossiers

Renommer et déplacer des fichiers en masse

Introduction

Imaginez que vous rentrez de vacances avec 347 photos nommées IMG_0001.jpg, IMG_0002.jpg... et que vous souhaitez les renommer en Vacances_2024_001.jpg, tout en les classant dans des dossiers par date. Le faire à la main prendrait des heures. Avec Python, cela prend quelques secondes.

Mise en situation

Vous travaillez comme assistant administratif pour une petite entreprise. Le service comptabilité vous envoie chaque mois un dossier contenant des centaines de factures scannées avec des noms incohérents (scan001.pdf, facture_final2.pdf, doc(3).pdf...).

Votre défi

Votre mission : écrire un script Python qui renomme automatiquement tous ces fichiers selon un format standard (Facture_2024_001.pdf) et les déplace dans des dossiers organisés par mois.

Les outils essentiels : os et shutil

Python possède deux modules natifs indispensables pour manipuler des fichiers :

ModuleRôle principalFonctions clés
osInteragir avec le système de fichiersos.listdir(), os.rename(), os.path.join()
shutilCopier/déplacer des fichiers et dossiersshutil.move(), shutil.copy()
pathlibApproche moderne orientée objetPath.rename(), Path.glob()

💡 À retenir : os.rename() sert à renommer un fichier dans le même dossier, tandis que shutil.move() permet de le renommer et/ou de le déplacer vers un autre dossier en une seule opération.

Le processus étape par étape

Avant de coder, il est essentiel de comprendre la logique du script :

Étape 1 : Lister les fichiers

python
1import os
2
3dossier = "photos_vacances"
4
5# Liste tous les éléments (fichiers ET dossiers) du répertoire
6fichiers = os.listdir(dossier)
7print(fichiers)
8# ['IMG_0001.jpg', 'IMG_0002.jpg', 'IMG_0003.png', ...]

Étape 2 : Renommer selon une règle

python
1import os
2
3dossier = "photos_vacances"
4compteur = 1
5
6for nom_fichier in os.listdir(dossier):
7    # On ne traite que les fichiers .jpg
8    if nom_fichier.endswith(".jpg"):
9        ancien_chemin = os.path.join(dossier, nom_fichier)
10        nouveau_nom = f"Vacances_2024_{compteur:03d}.jpg"
11        nouveau_chemin = os.path.join(dossier, nouveau_nom)
12        
13        os.rename(ancien_chemin, nouveau_chemin)
14        print(f"✅ {nom_fichier}{nouveau_nom}")
15        
16        compteur += 1

⚠️ Attention : os.rename() écrase silencieusement un fichier existant portant le même nom sans demander confirmation ! Vérifiez toujours que le nom de destination n'existe pas déjà, ou vous risquez de perdre des données.

Étape 3 : Déplacer les fichiers avec shutil

python
1import os
2import shutil
3
4dossier_source = "factures_brutes"
5dossier_destination = "factures_2024_01"
6
7# Créer le dossier de destination s'il n'existe pas
8os.makedirs(dossier_destination, exist_ok=True)
9
10for nom_fichier in os.listdir(dossier_source):
11    if nom_fichier.endswith(".pdf"):
12        chemin_source = os.path.join(dossier_source, nom_fichier)
13        chemin_destination = os.path.join(dossier_destination, nom_fichier)
14        
15        shutil.move(chemin_source, chemin_destination)
16        print(f"📁 Déplacé : {nom_fichier}")

Script complet : renommer ET déplacer

Voici un script combinant les deux opérations, avec gestion des erreurs :

python
1import os
2import shutil
3
4def organiser_fichiers(dossier_source, dossier_destination, prefixe):
5    """Renomme et déplace tous les fichiers .pdf d'un dossier."""
6    
7    os.makedirs(dossier_destination, exist_ok=True)
8    compteur = 1
9    
10    for nom_fichier in os.listdir(dossier_source):
11        chemin_complet = os.path.join(dossier_source, nom_fichier)
12        
13        # On ignore les sous-dossiers
14        if not os.path.isfile(chemin_complet):
15            continue
16        
17        if nom_fichier.lower().endswith(".pdf"):
18            extension = ".pdf"
19            nouveau_nom = f"{prefixe}_{compteur:03d}{extension}"
20            nouveau_chemin = os.path.join(dossier_destination, nouveau_nom)
21            
22            try:
23                shutil.move(chemin_complet, nouveau_chemin)
24                print(f"✅ {nom_fichier}{nouveau_nom}")
25                compteur += 1
26            except Exception as erreur:
27                print(f"❌ Erreur avec {nom_fichier} : {erreur}")
28
29# Utilisation
30organiser_fichiers("factures_brutes", "factures_2024_01", "Facture_2024")

Simulateur de renommage

Testez comment un nom de fichier serait transformé par notre script (simulation, aucun vrai fichier n'est modifié).

Répartir par date avec pathlib (bonus moderne)

python
1from pathlib import Path
2import shutil
3from datetime import datetime
4
5dossier = Path("photos_vacances")
6
7for fichier in dossier.glob("*.jpg"):
8    # Récupère la date de modification du fichier
9    date_modif = datetime.fromtimestamp(fichier.stat().st_mtime)
10    nom_mois = date_modif.strftime("%Y-%m")
11    
12    dossier_mois = dossier / nom_mois
13    dossier_mois.mkdir(exist_ok=True)
14    
15    shutil.move(str(fichier), str(dossier_mois / fichier.name))

Le saviez-vous ?

Le module 'shutil' tire son nom de 'shell utilities' (utilitaires de shell). Il a été conçu pour reproduire en Python les commandes que l'on utiliserait normalement dans un terminal, comme 'mv' ou 'cp' sous Linux/Mac !

Documentation officielle Python - shutil

Bonnes pratiques à respecter

🎯 En pratique : Avant de lancer un script sur vos vrais fichiers, testez-le d'abord avec print() au lieu de os.rename()/shutil.move(). Cela vous permet de vérifier que la logique de renommage est correcte sans risquer de fichiers perdus.

Voici un récapitulatif des précautions essentielles :

PrécautionPourquoi ?
Faire une copie de sauvegarde avantUn bug peut renommer/écraser des fichiers irrécupérables
Tester sur un petit échantillonDétecter les erreurs avant traitement massif
Vérifier l'existence du fichier destinationÉviter d'écraser accidentellement un fichier
Utiliser try/exceptGérer proprement les erreurs (fichier verrouillé, permissions...)
Journaliser les actions (print ou fichier log)Garder une trace de ce qui a été fait

Points clés

💡 À retenir : La combinaison os.listdir() pour lister, une boucle for pour parcourir, et shutil.move() pour agir constitue le squelette de 90% des scripts d'automatisation de fichiers.

⚠️ Attention : Les chemins de fichiers diffèrent entre Windows (\) et Mac/Linux (/). Utilisez toujours os.path.join() ou pathlib.Path pour que votre script fonctionne sur tous les systèmes d'exploitation.

Mini-Quiz
Question 1 / 3

Quelle fonction permet de déplacer un fichier vers un autre dossier en Python ?

En bref
  • 1Les modules os et shutil permettent respectivement de lister/renommer des fichiers et de les déplacer entre dossiers.
  • 2Un script de renommage en masse suit une logique simple : lister les fichiers, appliquer une règle de nommage, puis déplacer ou renommer chaque fichier avec gestion des erreurs.
  • 3Toujours tester son script avec des print() ou sur un échantillon avant de l'exécuter sur l'ensemble des fichiers, pour éviter toute perte de données irréversible.