10 — Script de rangement de fichiers

Niveau requis : 5 (pathlib, fichiers) / Difficulté : 3/5 / Durée estimée : 2–3 h

Objectif

Un script qui range un dossier en désordre (typiquement Downloads) : il classe les fichiers dans des sous-dossiers par type (images/, documents/, archives/, autres/…) selon leur extension.

python organize.py C:\Users\moi\Downloads
[SIMULATION] photo.jpg      -> images/
[SIMULATION] rapport.pdf    -> documents/
[SIMULATION] setup.exe      -> programmes/
12 fichiers a deplacer. Relance avec --apply pour executer.

⚠️ C'est le premier projet qui MODIFIE de vrais fichiers sur ta machine. Un bug ici ne fait pas un traceback : il déplace ou écrase TES fichiers. D'où la règle absolue de ce projet : le mode simulation (dry-run) est le mode par défaut, et rien n'est déplacé tant qu'on ne passe pas --apply explicitement. Tous les outils sérieux qui touchent au système fonctionnent ainsi. C'est LA compétence enseignée ici — plus importante que pathlib lui-même.

Notions utilisées

Cahier des charges

Étapes de construction

  1. Crée d'abord un dossier de test test_folder/ avec une dizaine de faux fichiers de types variés (tu peux les créer en Python : Path("test_folder/photo.jpg").touch()…). Tu ne pointeras le script sur un VRAI dossier qu'à la toute fin. Écris ensuite organize.py qui liste les fichiers du dossier passé en argument (sys.argv[1], iterdir()).
  2. Ajoute la validation : argument manquant ou dossier inexistant → message d'usage + sys.exit(1). Teste les deux cas.
  3. Ajoute le dict CATEGORIES et une fonction get_category(path) basée sur path.suffix.lower(). Affiche fichier -> categorie pour chaque fichier. Vérifie chaque classement à l'œil.
  4. Implémente la simulation complète : lignes [SIMULATION] source -> destination, total, et le message « relance avec --apply ». À ce stade le script est déjà UTILE et ne présente aucun risque.
  5. Détecte le flag --apply dans sys.argv. Implémente le déplacement réel : mkdir(exist_ok=True) pour la catégorie, puis rename(). Lance sur test_folder/ uniquement. Vérifie le résultat, recrée le dossier de test, relance.
  6. Gère les collisions : fonction unique_destination(path) qui suffixe _1, _2… tant que la cible existe. Teste en mettant deux fois le même nom de fichier dans deux catégories… puis en relançant le script deux fois.
  7. Test final sur un vrai dossier : d'abord en simulation, LIS chaque ligne, puis --apply seulement si tout est correct. C'est le workflow que tu garderas à vie.

Extensions possibles

  1. Option --by-date : classer en sous-dossiers 2026-07/ selon la date de modification (path.stat().st_mtime, module datetime).
  2. Journal des déplacements dans un fichier organize_log.txt (date, source, destination) — indispensable pour retrouver un fichier « disparu ».
  3. Mode --undo qui rejoue le journal à l'envers. Difficile et instructif : tu comprendras pourquoi les vrais outils gardent des logs.
  4. Config du mapping dans un categories.json externe.

Erreurs fréquentes sur ce projet

Critères de réussite

Commit conseillé

git add projects/mini-projects/10-script-rangement-fichiers/
git commit -m "project: add file organizer script"

Puis entrée de journal + git push. Ne committe PAS ton dossier de test plein de faux fichiers (test_folder/ dans .gitignore).