Depuis que je gère des projets web et des pipelines de déploiement, j’ai passé des heures à automatiser la création, la copie, le déplacement et la suppression de fichiers sur des serveurs et des postes de développement. Dans ce dossier je vous explique, pas à pas, comment utiliser efficacement shutil et pathlib en *Python* pour organiser un système de fichiers, éviter les erreurs courantes lors de transferts entre disques, et préserver les métadonnées quand c’est nécessaire. Je vous livre des exemples concrets tirés de mon expérience en agence, des extraits de code prêts à l’emploi et des bonnes pratiques pour une solide gestion des fichiers.
- Créer des fichiers rapidement avec pathlib
- Déplacer fichiers/dossiers entre répertoires et disques avec shutil.move
- Préserver les métadonnées via copy2 quand nécessaire
- Gérer les collisions, permissions et opérations atomiques
- Automatiser l’organisation et la sauvegarde dans des scripts robustes
Réponse rapide : Pour déplacer un fichier ou un dossier en Python, j’utilise généralement shutil.move(source, destination) (il renvoie le chemin de destination et déplace récursivement les dossiers). Pour manipuler les chemins et créer des répertoires de façon lisible, j’utilise pathlib. Pour conserver les métadonnées, j’appelle copy2 comme fonction de copie quand nécessaire.
Créer et déplacer des fichiers avec shutil et pathlib en Python
Quand j’ai commencé à automatiser les rapports mensuels de mon client, j’ai bifurqué vers pathlib pour la clarté des chemins et shutil pour les opérations lourdes de déplacement et de copie. pathlib rend les chemins objectifs et testables, et shutil.move gère à la fois les fichiers et les dossiers.
Exemple simple : créer un fichier puis le déplacer.
from pathlib import Path
p = Path(‘reports/report.txt’)
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text(‘Rapport du mois’)
import shutil
print(shutil.move(‘reports/report.txt’, ‘archive/report.txt’))
Insight : Utilisez pathlib pour manipuler les chemins et shutil.move pour les opérations de transfert, surtout entre volumes différents.

Comment fonctionne exactement la méthode move du module shutil
La méthode shutil.move accepte trois paramètres : le chemin source, le chemin de destination, et une fonction_de_copie optionnelle (par défaut copy2). Elle retourne le chemin de destination du fichier déplacé.
Si le déplacement se fait entre deux systèmes de fichiers, shutil.move effectue une copie puis une suppression. Si les chemins source et destination sont identiques, la méthode écrase simplement le contenu ciblé.
Exemples courts :
- Déplacer un fichier : shutil.move(‘file1.txt’, ‘file2.txt’)
- Déplacer un dossier : shutil.move(‘dir’, ‘trg’)
Insight : Pour préserver les métadonnées, passez explicitement copy2 ou utilisez-le dans vos routines de sauvegarde.
Exemple concret : organiser des rapports et gérer les collisions
Dans un projet réel, je reçois des fichiers nommés identiquement chaque mois. J’automatise l’archivage en créant d’abord la structure, puis en déplaçant les fichiers tout en gérant les collisions.
Script type :
from pathlib import Path
import shutil
src = Path(‘incoming/report.txt’)
dst_dir = Path(‘archive/2025-11’)
dst_dir.mkdir(parents=True, exist_ok=True)
dst = dst_dir / src.name
if dst.exists():
dst = dst_dir / f »{src.stem}_v2{src.suffix} »
print(shutil.move(str(src), str(dst)))
J’utilise toujours des noms datés ou une version pour éviter d’écraser sans contrôle. Si je dois forcer l’écrasement, j’utilise d’abord une sauvegarde temporaire.
Checklist pratique :
- Créer les répertoires avec Path.mkdir(parents=True, exist_ok=True)
- Vérifier l’existence avec Path.exists()
- Préserver les métadonnées si besoin via copy2
- Garder une copie temporaire avant suppression finale
Insight : Prévoir des stratégies de renommage automatique évite les pertes de données en production.

Comparaison : shutil.move vs pathlib.rename et autres alternatives
pathlib.Path.rename() est rapide et atomique mais échoue si le déplacement traverse des systèmes de fichiers. À l’inverse, shutil.move gère ce cas en effectuant une copie suivie d’une suppression.
Si vous avez besoin d’un remplacement atomique (écrasement sûr), préférez Path.replace(). Pour préserver les métadonnées, utilisez shutil.copy2 avant suppression.
Exemple résumé :
- Même partition : Path.rename()
- Entre partitions : shutil.move()
- Remplacement atomique : Path.replace()
Insight : Choisissez la méthode selon le contexte (performance, atomicité, conservation des métadonnées).
Bonnes pratiques pour la gestion des fichiers et la sécurité
Dans mon agence, chaque script de manipulation de fichiers suit un même modèle : validation des chemins, création sécurisée des dossiers, journalisation, et gestion d’erreurs explicite.
Points à respecter :
- Valider les inputs et éviter les chemins relatifs risqués
- Traiter PermissionError et FileNotFoundError distinctement
- Ne jamais supprimer sans sauvegarde préalable (utiliser shutil.rmtree avec prudence)
- Conserver des logs pour chaque opération de création, copie, déplacement et suppression
Insight : Les opérations sur le système de fichiers demandent autant d’attention que le code métier : testez sur des copies avant d’exécuter en production.

Boîte à outils : fonctions utiles (os, shutil, pathlib)
- Path.write_text() — créer et écrire un fichier en une ligne.
- shutil.move() — déplacer un fichier ou dossier (retourne le chemin de destination).
- shutil.copy2() — copier un fichier en préservant les métadonnées.
- shutil.rmtree() — supprimer récursivement un dossier (attention aux conséquences).
- os.getcwd() — connaître le répertoire courant.
- os.path.exists(), Path.exists() — vérifier l’existence d’un chemin.
- os.path.isdir() et os.path.isfile() — distinguer fichiers et dossiers.
- os.scandir() — parcourir rapidement les entrées d’un dossier.
Insight : Combinez ces outils pour construire des scripts robustes et lisibles, privilégiant pathlib pour la manipulation des chemins.
Cas d’usage : automatisation d’archives et sauvegardes
J’ai automatisé une routine qui chaque nuit sauvegarde les rapports et les déplace vers un stockage externe. Le flux : collecter via glob, créer l’arborescence de destination, copier avec copy2, vérifier l’intégrité, puis supprimer localement.
Ce processus m’a évité des pertes lors d’un incident disque : la copie avec métadonnées a permis une restauration fidèle.
Insight : Une stratégie de sauvegarde doit toujours inclure des vérifications post-copie avant toute suppression.
Comment éviter d’écraser un fichier lors d’un déplacement ?
Vérifiez d’abord si le chemin de destination existe via Path.exists(). Si oui, renommez automatiquement (avec un suffixe date/version) ou effectuez une copie de sauvegarde avant d’écraser. Utilisez également Path.replace() pour un remplacement atomique si nécessaire.
Quand utiliser shutil.move plutôt que pathlib.Path.rename ?
Utilisez shutil.move pour les déplacements entre systèmes de fichiers ou quand vous souhaitez que Python copie et supprime automatiquement. Path.rename() est préférable pour des opérations locales sur la même partition, car elle est plus rapide et peut être atomique.
Comment préserver les métadonnées (horodatage, permissions) lors d’une copie ?
Employez shutil.copy2(source, destination) qui copie les métadonnées comme les timestamps et les permissions. Si vous déplacez entre systèmes et voulez conserver ces données, combinez copy2 puis supprimez l’original.
Quelle méthode pour supprimer récursivement un dossier ?
Pour supprimer un dossier et tout son contenu, utilisez shutil.rmtree(path). Prenez des précautions : testez d’abord sur un environnement non critique et assurez-vous d’avoir des sauvegardes.

