AI-agenter · Lektion

Katalogtraversering och filsökning

os.walk(), glob-mönster och filtrering av filer efter typ eller datum.

Lektion 2 av 413 steg

Katalogtraversering och filsökning är en gratis lektion i AI-agenter på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI-agenter, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-agenter innehåller totalt 4 lektioner.

Varför agenter behöver gå igenom kataloger

Agenter behöver ofta hitta filer som uppfyller vissa kriterier — alla Python-filer i en kodbas, alla CSV-filer i en datakatalog eller alla nyligen skapade loggar. Python erbjuder tre huvudsakliga verktyg: os.walk(), Path.iterdir() och Path.rglob(). Var och en har olika styrkor beroende på hur djupt du behöver söka.

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() — rekursiv genomgång av kataloger

os.walk(root) returnerar en tupel med (dirpath, dirnames, filenames) för varje katalog i trädet. Det är den klassiska Python-metoden för rekursiv genomgång och ger detaljerad kontroll över vilka underkataloger som ska genomsökas.

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() — lista på en nivå

Path.iterdir() listar det omedelbara innehållet i en katalog — den går inte rekursivt igenom underkataloger. Använd den när du bara behöver katalogens direkta innehåll och vill undvika att gå djupare.

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() — rekursiv globbning

Path.rglob(pattern) hittar rekursivt alla filer som matchar ett globbmönster. Det är det kortaste sättet att hitta alla filer av en viss typ var som helst i ett katalogträd. ** i globbmönster betyder ”valfritt antal kataloger”.

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() — mönstermatchning

glob.glob(pattern, recursive=True) är det traditionella globbgränssnittet. Med recursive=True matchar jokertecknet ** alla sökvägar till underkataloger. Det returnerar strängar, medan pathlib.rglob returnerar Path-objekt.

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')

Filtrera efter filändelse

När du går igenom kataloger filtrerar du filer efter filändelse med Path.suffix (som inkluderar punkten, till exempel '.py') eller genom att kontrollera mot en mängd tillåtna filändelser. Det är snabbare och mer precist än globbmönster när du filtrerar efter flera filändelser.

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')

Filtrera efter filstorlek

Agenter behöver ibland hitta filer som ligger över eller under en storleksgräns — hoppa över små tomma filer eller undvik att bearbeta enorma filer som skulle överbelasta minnet. Använd Path.stat().st_size för att hämta filstorleken i byte.

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)}')

Filtrera efter ändringstid

Agenter i inkrementella pipelines behöver bara bearbeta filer som har ändrats sedan den senaste körningen. Använd stat().st_mtime (ändringstid som en Unix-tidsstämpel) för att hitta nyligen ändrade filer.

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")}')

Hoppa över dolda filer och systemkataloger

När du går igenom kodarkiv eller användarkataloger ska du hoppa över dolda filer (som börjar med .) och systemkataloger som .git, __pycache__, node_modules och .venv. De innehåller tusentals filer som är irrelevanta för de flesta agenter.

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')

Skapa en filinventering

En filinventering är en strukturerad sammanfattning av ett katalogträd — användbar för agenter som behöver planera arbetet innan bearbetningen börjar. Samla namn, sökväg, storlek, filändelse och ändringstid i en lista med dict-objekt som kan serialiseras till 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')

Övervaka en katalog efter ändringar

Vissa agenter behöver reagera när nya filer dyker upp i en katalog. Även om ett komplett filövervakningsbibliotek som watchdog är bäst i produktion, är ett enkelt alternativ att regelbundet skanna katalogen och jämföra resultatet med en känd mängd filer.

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)

Snabbkontroll: rglob jämfört med iterdir

Testa din förståelse av metoder för att gå igenom kataloger.

Sammanfattning av kataloggenomgång

Du kan nu hitta alla filer som din agent behöver:

  • os.walk() — full kontroll över rekursiv genomgång; ändra dirnames på plats för att begränsa underkatalogerna
  • Path.iterdir() — lista på en nivå över det omedelbara innehållet
  • Path.rglob('*.ext') — den renaste rekursiva sökningen med mönster
  • glob.glob('**/*.ext', recursive=True) — traditionellt alternativ som returnerar strängar
  • Filtrera med .suffix efter filändelse, .stat().st_size efter storlek och .stat().st_mtime efter ändringstid
  • Hoppa alltid över dolda filer och systemkataloger som .git och node_modules
Gratis att börja

Lär dig AI-agenter med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
60
Lektioner
239

Vanliga frågor

Är lektionen ”Katalogtraversering och filsökning” gratis?

Ja – hela texten till ”Katalogtraversering och filsökning” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI-agenter, kan Ni uppgradera till CoddyKit PRO. Kursen i AI-agenter innehåller totalt 4 lektioner.

Vad lär jag mig i ”Katalogtraversering och filsökning”?

os.walk(), glob-mönster och filtrering av filer efter typ eller datum. Ni övar på AI-agenter med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig AI-agenter?

Du behöver inga förkunskaper. Utbildningen i AI-agenter på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Katalogtraversering och filsökning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här AI-agenter-lektionen?

Ja. Varje AI-agenter-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Läsa och skriva filer i agentkontext
  2. Katalogtraversering och filsökning
  3. Filformat: CSV, JSON och TXT
  4. Säkra filoperationer med felhantering
← Tillbaka till AI-agenter