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 :
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.
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 officielle
def lister_fichiers_simule(dossier, systeme_fichiers, pattern="*"):
# Naviguer jusqu'au dossier
if dossier == ".":
contenu = systeme_fichiers
else:
parties = dossier.strip("/").split("/")
contenu = systeme_fichiers
for partie in parties:
if not isinstance(contenu, dict) or partie not in contenu:
return {"succes": False, "erreur": f"Le dossier n'existe pas : {dossier}"}
contenu = contenu[partie]
if not isinstance(contenu, dict):
return {"succes": False, "erreur": f"Le dossier n'existe pas : {dossier}"}
# Extraire l'extension du pattern
extension = None
if pattern != "*" and pattern.startswith("*."):
extension = pattern[1:] # ".py"
fichiers = []
for nom, valeur in contenu.items():
if isinstance(valeur, dict):
fichiers.append({"nom": f"{nom}/", "type": "dossier", "elements": len(valeur)})
else:
if extension and not nom.endswith(extension):
continue
fichiers.append({"nom": nom, "type": "fichier", "taille": len(valeur.encode("utf-8"))})
# Tri : dossiers d'abord, puis alphabetique
fichiers.sort(key=lambda f: (0 if f["type"] == "dossier" else 1, f["nom"]))
return {"succes": True, "dossier": dossier, "total": len(fichiers), "fichiers": fichiers}