Directory traversal en bestanden zoeken
os.walk(), glob-patronen en bestanden filteren op type of datum.
Directory traversal en bestanden zoeken is een gratis AI-agenten-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-agenten. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-agenten bevat in totaal 4 lessen.
Waarom agents mappen moeten doorzoeken
Agenten moeten vaak bestanden vinden die aan bepaalde criteria voldoen — alle Python-bestanden in een codebasis, alle CSV-bestanden in een gegevensmap of alle recente logbestanden. Python biedt drie belangrijke hulpmiddelen: os.walk(), Path.iterdir() en Path.rglob(). Elk hulpmiddel heeft andere sterke punten, afhankelijk van hoe diep je moet zoeken.
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() — Recursief door mappen lopen
os.walk(root) levert voor elke map in de boomstructuur een tupel van (dirpath, dirnames, filenames). Dit is de klassieke Python-aanpak voor recursief door mappen lopen en geeft je gedetailleerde controle over in welke submappen je afdaalt.
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() — Eén niveau weergeven
Path.iterdir() geeft de directe inhoud van een map weer — het doorloopt geen submappen. Gebruik het wanneer je alleen de directe onderliggende items van een map nodig hebt en wilt voorkomen dat je dieper afdaalt.
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() — Recursieve glob
Path.rglob(pattern) vindt recursief alle bestanden die overeenkomen met een globpatroon. Dit is de meest beknopte manier om overal in een mappenboom alle bestanden van een bepaald type te vinden. De ** in glob betekent "een willekeurig aantal mappen".
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() — Patronen vergelijken
glob.glob(pattern, recursive=True) is de traditionele glob-interface. Met recursive=True komt de joker ** overeen met elk pad naar een submap. Deze functie geeft tekenreeksen terug, terwijl pathlib.rglob Path-objecten teruggeeft.
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')Filteren op bestandsextensie
Filter bestanden tijdens het doorzoeken van mappen op hun extensie met Path.suffix (inclusief de punt, bijvoorbeeld '.py') of door te controleren of ze een van de toegestane extensies hebben. Dit is sneller en nauwkeuriger dan globpatronen wanneer je op meerdere extensies filtert.
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')Filteren op bestandsgrootte
Agenten moeten soms bestanden vinden die boven of onder een bepaalde drempelwaarde liggen — bijvoorbeeld om piepkleine lege bestanden over te slaan of te voorkomen dat enorme bestanden het geheugen overbelasten. Gebruik Path.stat().st_size om de bestandsgrootte in bytes op te vragen.
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)}')Filteren op wijzigingstijd
Agenten in incrementele pijplijnen hoeven alleen bestanden te verwerken die sinds de vorige uitvoering zijn gewijzigd. Gebruik stat().st_mtime (wijzigingstijd als Unix-tijdstempel) om recent gewijzigde bestanden te vinden.
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")}')Verborgen bestanden en systeemmappen overslaan
Sla bij het doorzoeken van coderepositories of gebruikersmappen verborgen bestanden (die met . beginnen) en systeemmappen zoals .git, __pycache__, node_modules en .venv over. Deze bevatten duizenden bestanden die voor de meeste agents niet relevant zijn.
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')Een bestandsinventaris maken
Een bestandsinventaris is een gestructureerd overzicht van een mappenboom — nuttig voor agents die hun werk willen plannen voordat ze bestanden verwerken. Verzamel naam, pad, grootte, extensie en wijzigingstijd in een lijst met woordenboeken die naar JSON kan worden geserialiseerd.
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')Een map op wijzigingen controleren
Sommige agents moeten reageren wanneer er nieuwe bestanden in een map verschijnen. Hoewel een volledige bibliotheek voor bestandsbewaking, zoals watchdog, het beste is voor productiegebruik, kun je de map ook eenvoudig periodiek scannen en de resultaten vergelijken met een bekende verzameling bestanden.
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)
Korte controle: rglob versus iterdir
Controleer je begrip van methoden voor het doorzoeken van mappen.
Overzicht van mappen doorzoeken
Je kunt nu elk bestand vinden dat je agent nodig heeft:
- os.walk() — volledige controle over recursief door mappen lopen; pas
dirnamesdirect aan om submappen over te slaan - Path.iterdir() — een lijst van de directe inhoud van één niveau
- Path.rglob('*.ext') — de overzichtelijkste recursieve zoekopdracht op basis van een patroon
- glob.glob('**/*.ext', recursive=True) — traditioneel alternatief dat tekenreeksen teruggeeft
- Filter met
.suffixop extensie, met.stat().st_sizeop grootte en met.stat().st_mtimeop wijzigingstijd - Sla verborgen bestanden en systeemmappen zoals
.gitennode_modulesaltijd over
Leer AI-agenten met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 60
- Lessen
- 239
Veelgestelde vragen
Is de les “Directory traversal en bestanden zoeken” gratis?
Ja — de volledige tekst van “Directory traversal en bestanden zoeken” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus AI-agenten wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus AI-agenten bevat in totaal 4 lessen.
Wat leer ik in “Directory traversal en bestanden zoeken”?
os.walk(), glob-patronen en bestanden filteren op type of datum. Je oefent met AI-agenten door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met AI-agenten te beginnen?
Ervaring vooraf is niet nodig. AI-agenten op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Directory traversal en bestanden zoeken”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over AI-agenten?
Ja. Elke les over AI-agenten bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Bestanden lezen en schrijven in een agentcontext
- Directory traversal en bestanden zoeken
- Bestandsindelingen verwerken: CSV, JSON en TXT
- Veilige bestandsbewerkingen met foutafhandeling