Exercices Projets guidés Outil : lister les fichiers d'un dossier
🎉

Bravo!

Débutant 🧠 Fondamentaux 10 XP 0 personnes ont réussi

Outil : lister les fichiers d'un dossier

Quand tu demandes a Claude Code "montre-moi la structure du projet", il utilise un outil pour lister les fichiers. C'est comme faire un ls ou un tree dans le terminal, mais de maniere programmatique.

Pour ton Mini Claude Code, tu as besoin d'un deuxieme outil : explorer les dossiers. Le LLM doit pouvoir savoir quels fichiers existent avant de decider lequel lire. Sans ca, il travaille a l'aveugle.

En vrai Python, on utilise pathlib pour parcourir les dossiers :

from pathlib import Path

dossier = Path("src/")
for fichier in dossier.glob("*.py"):
print(fichier.name, fichier.stat().st_size)

La methode glob() accepte des motifs : *.py pour les fichiers Python, **/*.py pour chercher recursivement dans les sous-dossiers, *.md pour le markdown.

On va travailler avec un systeme de fichiers simule (un dictionnaire de dictionnaires). Chaque cle est un nom de fichier ou de sous-dossier. Les fichiers ont une valeur string (le contenu), les dossiers ont une valeur dict (leur contenu).

Ecris une fonction lister_fichiers_simule(dossier, systeme_fichiers, pattern="*") qui prend un chemin de dossier, le systeme de fichiers simule, et un pattern optionnel.

La fonction doit renvoyer un dictionnaire :

En cas de succes : {"succes": True, "fichiers": [...], "dossier": "src/", "total": 3}
En cas d'erreur : {"succes": False, "erreur": "Le dossier n'existe pas : lib/"}

Chaque fichier dans la liste est un dictionnaire :

{"nom": "app.py", "type": "fichier", "taille": 42}
{"nom": "tests/", "type": "dossier", "elements": 3}

Le pattern filtre les fichiers par extension. "*" renvoie tout. "*.py" ne renvoie que les fichiers .py (mais inclut toujours les dossiers). Le tri est alphabetique, dossiers d'abord.

Exemple :

fs = {
"src": {
"app.py": "print('hello')",
"utils.py": "def aide(): pass",
"tests": {"test_app.py": "assert True"}
}
}

lister_fichiers_simule("src", fs)
renvoie {"succes": True, "dossier": "src", "total": 3, "fichiers": [
{"nom": "tests/", "type": "dossier", "elements": 1},
{"nom": "app.py", "type": "fichier", "taille": 14},
{"nom": "utils.py", "type": "fichier", "taille": 16}
]}

Tests (4/5)

Lister un dossier simple
fs = {"src": {"app.py": "code", "utils.py": "code2"}}
r = lister_fichiers_simule("src", fs)
assert r["succes"] == True
assert r["total"] == 2
assert all(f["type"] == "fichier" for f in r["fichiers"])
Dossier inexistant
fs = {"src": {"app.py": "code"}}
r = lister_fichiers_simule("lib", fs)
assert r["succes"] == False
assert "lib" in r["erreur"]
Filtrer par pattern *.py
fs = {"src": {"app.py": "code", "readme.md": "doc", "tests": {}}}
r = lister_fichiers_simule("src", fs, pattern="*.py")
noms_fichiers = [f["nom"] for f in r["fichiers"] if f["type"] == "fichier"]
assert "app.py" in noms_fichiers, "app.py doit etre dans la liste"
assert "readme.md" not in noms_fichiers, "readme.md ne doit pas etre dans la liste avec *.py"
# Les dossiers restent visibles
noms_dossiers = [f["nom"] for f in r["fichiers"] if f["type"] == "dossier"]
assert "tests/" in noms_dossiers, "Les dossiers doivent rester visibles meme avec un filtre"
Dossiers d'abord dans le tri
fs = {"projet": {"zebra.py": "z", "alpha.py": "a", "config": {"s.toml": ""}}}
r = lister_fichiers_simule("projet", fs)
assert r["fichiers"][0]["type"] == "dossier", "Les dossiers doivent apparaitre avant les fichiers"
assert r["fichiers"][0]["nom"] == "config/"

+ 0 tests cachés

Indices (3 disponibles)

solution.py