Parcours des répertoires et découverte de fichiers
os.walk(), motifs glob et filtrage des fichiers par type ou par date.
Parcours des répertoires et découverte de fichiers est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
Pourquoi les agents doivent parcourir les répertoires
Les agents doivent souvent rechercher des fichiers répondant à certains critères : tous les fichiers Python d’une base de code, tous les fichiers CSV d’un répertoire de données ou tous les journaux récents. Python fournit trois outils principaux : os.walk(), Path.iterdir() et Path.rglob(). Chacun possède ses propres atouts, selon la profondeur de recherche nécessaire.
import os
from pathlib import Path
# Count all files in a directory tree
root = Path('/tmp/agent_workspace')
file_count = sum(1 for f in root.rglob('*') if f.is_file())
print(f'Found {file_count} files under {root}')os.walk() — Parcours récursif des répertoires
os.walk(root) produit un tuple (dirpath, dirnames, filenames) pour chaque répertoire de l’arborescence. Il s’agit de l’approche Python classique pour le parcours récursif, qui vous donne un contrôle précis sur les sous-répertoires à parcourir.
import os
import tempfile
# --- demo setup: build a small project tree so the walk has something to show ---
root = tempfile.mkdtemp(prefix='project_')
os.makedirs(os.path.join(root, 'src'), exist_ok=True)
os.makedirs(os.path.join(root, '.git'), exist_ok=True)
with open(os.path.join(root, 'README.md'), 'w') as f:
f.write('demo')
with open(os.path.join(root, 'src', 'main.py'), 'w') as f:
f.write('print(1)')
for dirpath, dirnames, filenames in os.walk(root):
# Skip hidden directories (like .git)
dirnames[:] = [d for d in dirnames if not d.startswith('.')]
print(f'In directory: {dirpath}')
print(f' Subdirs: {dirnames}')
print(f' Files: {filenames}')
for filename in filenames:
full_path = os.path.join(dirpath, filename)
print(f' File: {full_path}')
Path.iterdir() — Liste d’un seul niveau
Path.iterdir() répertorie le contenu immédiat d’un répertoire : la méthode ne parcourt pas les sous-répertoires. Utilisez-la lorsque vous avez uniquement besoin des éléments directement contenus dans un répertoire et que vous voulez éviter d’aller plus en profondeur.
from pathlib import Path
data_dir = Path('data')
data_dir.mkdir(exist_ok=True)
(data_dir / 'a.csv').write_text('x')
(data_dir / 'sub').mkdir(exist_ok=True)
for item in data_dir.iterdir():
if item.is_file():
print(f'FILE: {item.name} ({item.stat().st_size} bytes)')
elif item.is_dir():
print(f'DIR: {item.name}/')
csv_files = [f for f in data_dir.iterdir()
if f.is_file() and f.suffix == '.csv']
print(f'Found {len(csv_files)} CSV files')Path.rglob() — Recherche glob récursive
Path.rglob(pattern) recherche récursivement tous les fichiers correspondant à un motif glob. C’est la manière la plus concise de trouver tous les fichiers d’un type donné, où qu’ils se trouvent dans une arborescence de répertoires. Dans glob, ** signifie « un nombre quelconque de répertoires ».
from pathlib import Path
project = Path('/tmp/my_project')
# Find all Python files recursively
python_files = list(project.rglob('*.py'))
print(f'Found {len(python_files)} Python files:')
for f in python_files:
print(f' {f.relative_to(project)}')
# Find all JSON files
json_files = list(project.rglob('*.json'))
# Find files matching a name pattern
test_files = list(project.rglob('test_*.py'))
print(f'Found {len(test_files)} test files')glob.glob() — Correspondance de motifs
glob.glob(pattern, recursive=True) est l’interface glob traditionnelle. Avec recursive=True, le caractère générique ** correspond à tout chemin de sous-répertoire. La méthode renvoie des chaînes de caractères, tandis que pathlib.rglob renvoie des objets Path.
import glob
# Find all CSV files recursively
csv_files = glob.glob('data/**/*.csv', recursive=True)
print(f'Found {len(csv_files)} CSV files')
for f in csv_files:
print(f' {f}')
# Find all log files in a specific directory (non-recursive)
logs = glob.glob('/var/log/*.log')
# Find files matching multiple criteria
import fnmatch
all_files = glob.glob('/tmp/**/*', recursive=True)
config_files = [
f for f in all_files
if fnmatch.fnmatch(f, '*.yaml') or fnmatch.fnmatch(f, '*.yml')
]
print(f'Found {len(config_files)} YAML config files')Filtrage par extension de fichier
Lors du parcours des répertoires, filtrez les fichiers selon leur extension à l’aide de Path.suffix (qui inclut le point, par exemple '.py') ou en vérifiant leur présence dans un ensemble d’extensions autorisées. Cette méthode est plus rapide et plus précise que les motifs glob pour filtrer plusieurs extensions.
from pathlib import Path
directory = Path('/tmp/mixed_files')
ALLOWED_EXTENSIONS = {'.py', '.js', '.ts', '.json', '.yaml'}
# Filter by allowed extensions
code_files = [
f for f in directory.rglob('*')
if f.is_file() and f.suffix.lower() in ALLOWED_EXTENSIONS
]
print(f'Found {len(code_files)} code/config files')
# Group files by extension
from collections import defaultdict
by_ext = defaultdict(list)
for f in directory.rglob('*'):
if f.is_file():
by_ext[f.suffix].append(f)
for ext, files in sorted(by_ext.items()):
print(f'{ext}: {len(files)} files')Filtrage par taille de fichier
Les agents doivent parfois rechercher des fichiers dont la taille est supérieure ou inférieure à un seuil : ignorer les petits fichiers vides ou éviter de traiter d’énormes fichiers qui satureraient la mémoire. Utilisez Path.stat().st_size pour obtenir la taille du fichier en octets.
from pathlib import Path
data_dir = Path('/tmp/data')
MIN_SIZE = 1024 # 1 KB — skip empty/tiny files
MAX_SIZE = 50_000_000 # 50 MB — skip very large files
processable = []
skipped_small = []
skipped_large = []
for f in data_dir.rglob('*.json'):
if not f.is_file():
continue
size = f.stat().st_size
if size < MIN_SIZE:
skipped_small.append(f.name)
elif size > MAX_SIZE:
skipped_large.append(f.name)
else:
processable.append(f)
print(f'Processable: {len(processable)}')
print(f'Too small: {len(skipped_small)}')
print(f'Too large: {len(skipped_large)}')Filtrage par date de modification
Dans les pipelines incrémentaux, les agents doivent uniquement traiter les fichiers qui ont changé depuis la dernière exécution. Utilisez stat().st_mtime (la date de modification sous forme d’horodatage Unix) pour trouver les fichiers récemment modifiés.
from pathlib import Path
import time
import datetime
data_dir = Path('/tmp/data')
# Files modified in the last 24 hours
cutoff = time.time() - (24 * 60 * 60)
recent_files = [
f for f in data_dir.rglob('*.log')
if f.is_file() and f.stat().st_mtime > cutoff
]
print(f'Modified in last 24h: {len(recent_files)} files')
# Sort by modification time (newest first)
recent_files.sort(key=lambda f: f.stat().st_mtime, reverse=True)
for f in recent_files[:5]: # top 5 most recent
mtime = datetime.datetime.fromtimestamp(f.stat().st_mtime)
print(f' {f.name}: {mtime.strftime("%Y-%m-%d %H:%M:%S")}')Ignorer les fichiers cachés et les répertoires système
Lors du parcours de dépôts de code ou de répertoires utilisateur, ignorez les fichiers cachés (dont le nom commence par .) et les répertoires système comme .git, __pycache__, node_modules et .venv. Ils contiennent des milliers de fichiers qui ne sont pas pertinents pour la plupart des agents.
from pathlib import Path
SKIP_DIRS = {'.git', '__pycache__', 'node_modules', '.venv',
'.env', 'dist', 'build', '.mypy_cache'}
def iter_source_files(root, extensions):
root = Path(root)
for path in root.rglob('*'):
# Skip if any parent is in SKIP_DIRS
if any(part in SKIP_DIRS for part in path.parts):
continue
# Skip hidden files
if path.name.startswith('.'):
continue
if path.is_file() and path.suffix in extensions:
yield path
python_files = list(iter_source_files('/tmp/project', {'.py'}))
print(f'Found {len(python_files)} Python source files')Création d’un inventaire de fichiers
Un inventaire de fichiers est un résumé structuré d’une arborescence de répertoires, utile aux agents qui doivent planifier leur travail avant le traitement. Rassemblez le nom, le chemin, la taille, l’extension et la date de modification dans une liste de dictionnaires pouvant être sérialisée en JSON.
from pathlib import Path
import datetime
import json
def build_inventory(root_dir, pattern='**/*'):
root = Path(root_dir)
inventory = []
for f in root.glob(pattern):
if not f.is_file():
continue
stat = f.stat()
inventory.append({
'name': f.name,
'path': str(f.relative_to(root)),
'extension': f.suffix,
'size_bytes': stat.st_size,
'modified': datetime.datetime.fromtimestamp(
stat.st_mtime
).isoformat()
})
return sorted(inventory, key=lambda x: x['path'])
inventory = build_inventory('/tmp/data')
with open('file_inventory.json', 'w') as out:
json.dump(inventory, out, indent=2)
print(f'Inventoried {len(inventory)} files')Surveillance des changements dans un répertoire
Certains agents doivent réagir lorsque de nouveaux fichiers apparaissent dans un répertoire. Bien qu’une bibliothèque complète de surveillance des fichiers comme watchdog soit préférable en production, une approche simple consiste à analyser périodiquement le répertoire et à comparer le résultat à un ensemble connu de fichiers.
from pathlib import Path
import time
def watch_for_new_files(watch_dir, extension='.json', interval=5):
watch_dir = Path(watch_dir)
known_files = set(watch_dir.glob(f'*{extension}'))
print(f'Watching {watch_dir} for new {extension} files...')
while True:
time.sleep(interval)
current_files = set(watch_dir.glob(f'*{extension}'))
new_files = current_files - known_files
for f in new_files:
print(f'New file detected: {f.name}')
process_new_file(f) # handle the new file
known_files = current_files
def process_new_file(file_path):
print(f'Processing: {file_path}')
# --- demo (one polling cycle, without the infinite while True loop) ---
import tempfile
demo_dir = Path(tempfile.mkdtemp())
known_files = set(demo_dir.glob('*.json'))
print(f'Watching {demo_dir} for new .json files...')
(demo_dir / 'result_a.json').write_text('{}', encoding='utf-8')
(demo_dir / 'result_b.json').write_text('{}', encoding='utf-8')
current_files = set(demo_dir.glob('*.json'))
new_files = current_files - known_files
for f in sorted(new_files, key=lambda p: p.name):
print(f'New file detected: {f.name}')
process_new_file(f)
Vérification rapide : rglob contre iterdir
Testez votre compréhension des méthodes de parcours des répertoires.
Récapitulatif du parcours des répertoires
Vous pouvez maintenant trouver n’importe quel fichier dont votre agent a besoin :
- os.walk() — contrôle total du parcours récursif ; modifiez
dirnamessur place pour élaguer les sous-répertoires - Path.iterdir() — liste à un seul niveau des éléments directement contenus dans le répertoire
- Path.rglob('*.ext') — recherche récursive par motif, la plus claire
- glob.glob('**/*.ext', recursive=True) — alternative traditionnelle qui renvoie des chaînes de caractères
- Filtrez avec
.suffixpour l’extension,.stat().st_sizepour la taille et.stat().st_mtimepour la date de modification - Ignorez toujours les fichiers cachés et les répertoires système comme
.gitetnode_modules
Apprends AI Agents avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 60
- Leçons
- 239
Questions Fréquemment Posées
La leçon « Parcours des répertoires et découverte de fichiers » est-elle gratuite ?
Oui — le texte complet de « Parcours des répertoires et découverte de fichiers » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Parcours des répertoires et découverte de fichiers » ?
os.walk(), motifs glob et filtrage des fichiers par type ou par date. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Parcours des répertoires et découverte de fichiers » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Lire et écrire des fichiers dans le contexte d’un agent
- Parcours des répertoires et découverte de fichiers
- Gestion des formats de fichiers : CSV, JSON et TXT
- Opérations sûres sur les fichiers avec gestion des erreurs