Dizin Geçişi ve Dosya Keşfi
os.walk(), glob kalıpları ve dosyaları türe veya tarihe göre filtreleme.
Dizin Geçişi ve Dosya Keşfi, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Ajanlar Neden Dizinlerde Gezinmeye İhtiyaç Duyar
Ajanların çoğu zaman belirli ölçütlere uyan dosyaları bulması gerekir: bir kod tabanındaki tüm Python dosyaları, veri dizinindeki tüm CSV dosyaları veya en güncel günlüklerin tümü. Python bunun için üç temel araç sunar: os.walk(), Path.iterdir() ve Path.rglob(). Aramanın ne kadar derine inmesi gerektiğine bağlı olarak her birinin farklı güçlü yönleri vardır.
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() — Özyinelemeli Dizin Gezinmesi
os.walk(root), ağaçtaki her dizin için (dirpath, dirnames, filenames) demetini üretir. Özyinelemeli gezinme için klasik Python yaklaşımıdır ve hangi alt dizinlere girileceği üzerinde ayrıntılı denetim sağlar.
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() — Tek Düzeyli Listeleme
Path.iterdir() bir dizinin doğrudan içeriğini listeler; alt dizinlere özyinelemeli olarak girmez. Yalnızca bir dizinin doğrudan alt öğelerine ihtiyaç duyduğunuzda ve daha derine inmeyi önlemek istediğinizde kullanın.
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() — Özyinelemeli Glob
Path.rglob(pattern), bir glob kalıbıyla eşleşen tüm dosyaları özyinelemeli olarak bulur. Bir dizin ağacının herhangi bir yerindeki belirli türdeki tüm dosyaları bulmanın en kısa yoludur. Glob içindeki **, “herhangi sayıda dizin” anlamına gelir.
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() — Kalıp Eşleştirme
glob.glob(pattern, recursive=True), geleneksel glob arayüzüdür. recursive=True ile ** joker karakteri, herhangi bir alt dizin yoluyla eşleşir. Bu işlev dizeler döndürürken pathlib.rglob Path nesneleri döndürür.
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')Dosya Uzantısına Göre Süzme
Dizinlerde gezinirken dosyaları uzantılarına göre Path.suffix (noktayı da içerir; örneğin '.py') kullanarak ya da izin verilen uzantılardan oluşan bir kümeyle karşılaştırarak süzün. Birden çok uzantıya göre süzme yaparken bu yöntem glob kalıplarından daha hızlı ve daha kesin sonuç verir.
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')Dosya Boyutuna Göre Süzme
Ajanların bazen belirli bir boyut eşiğinin üstündeki veya altındaki dosyaları bulması gerekir; örneğin çok küçük boş dosyaları atlamak ya da belleği aşırı zorlayacak dev dosyaları işlemekten kaçınmak için. Dosya boyutunu bayt cinsinden almak için Path.stat().st_size kullanın.
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)}')Değiştirilme Zamanına Göre Süzme
Artımlı işlem hatlarındaki ajanların yalnızca son çalıştırmadan beri değişen dosyaları işlemesi gerekir. Yakın zamanda değiştirilmiş dosyaları bulmak için stat().st_mtime (Unix zaman damgası olarak değiştirilme zamanı) kullanın.
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")}')Gizli Dosyaları ve Sistem Dizinlerini Atlamak
Kod depolarında veya kullanıcı dizinlerinde gezinirken gizli dosyaları (. ile başlayanlar) ve .git, __pycache__, node_modules ve .venv gibi sistem dizinlerini atlayın. Bunlar çoğu ajan için ilgisiz olan binlerce dosya içerir.
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')Dosya Envanteri Oluşturma
Dosya envanteri, bir dizin ağacının yapılandırılmış özetidir; işleme başlamadan önce çalışmayı planlaması gereken ajanlar için kullanışlıdır. Adı, yolu, boyutu, uzantıyı ve değiştirilme zamanını JSON'a serileştirilebilen bir sözlükler listesinde toplayın.
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')Değişiklikler için Dizin İzleme
Bazı ajanların bir dizinde yeni dosyalar göründüğünde tepki vermesi gerekir. Üretim ortamları için watchdog gibi tam kapsamlı bir dosya izleme kitaplığı en iyi seçenek olsa da basit bir yaklaşım, dizini belirli aralıklarla taramak ve bilinen dosya kümesiyle karşılaştırmaktır.
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)
Hızlı Kontrol: rglob ve iterdir Karşılaştırması
Dizinlerde gezinme yöntemlerini anlayıp anlamadığınızı sınayın.
Dizinlerde Gezinme Özeti
Artık ajanınızın ihtiyaç duyduğu her dosyayı bulabilirsiniz:
- os.walk() — özyinelemeli gezinme üzerinde tam denetim sağlar; alt dizinleri budamak için
dirnamesdeğerini yerinde değiştirin - Path.iterdir() — doğrudan alt öğelerin tek düzeyli listesi
- Path.rglob('*.ext') — kalıba göre en temiz özyinelemeli arama
- glob.glob('**/*.ext', recursive=True) — dizeler döndüren geleneksel alternatif
- Uzantı için
.suffix, boyut için.stat().st_size, değiştirilme zamanı için.stat().st_mtimekullanarak süzün .gitvenode_modulesgibi gizli dosyaları ve sistem dizinlerini her zaman atlayın
Sıkça Sorulan Sorular
“Dizin Geçişi ve Dosya Keşfi” dersi ücretsiz mi?
Evet — “Dizin Geçişi ve Dosya Keşfi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Dizin Geçişi ve Dosya Keşfi” dersinde ne öğreneceğim?
os.walk(), glob kalıpları ve dosyaları türe veya tarihe göre filtreleme. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Dizin Geçişi ve Dosya Keşfi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Aracı Bağlamında Dosya Okuma ve Yazma
- Dizin Geçişi ve Dosya Keşfi
- Dosya Biçimi İşleme: CSV, JSON ve TXT
- Hata İşleme ile Güvenli Dosya İşlemleri