Penelusuran Direktori dan Penemuan File
os.walk(), pola glob, dan penyaringan file berdasarkan jenis atau tanggal.
Penelusuran Direktori dan Penemuan File adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Mengapa Agen Memerlukan Penelusuran Direktori
Agen sering perlu menemukan berkas yang memenuhi kriteria tertentu — semua berkas Python dalam basis kode, semua berkas CSV dalam direktori data, atau semua log terbaru. Python menyediakan tiga alat utama: os.walk(), Path.iterdir(), dan Path.rglob(). Masing-masing memiliki keunggulan yang berbeda, bergantung pada seberapa dalam pencarian perlu dilakukan.
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() — Penelusuran Direktori Rekursif
os.walk(root) menghasilkan tupel (dirpath, dirnames, filenames) untuk setiap direktori dalam pohon. Ini merupakan pendekatan klasik Python untuk penelusuran rekursif dan memberi Anda kendali terperinci atas subdirektori mana yang akan ditelusuri.
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() — Daftar Satu Tingkat
Path.iterdir() mencantumkan isi langsung sebuah direktori — metode ini tidak menelusuri subdirektori secara rekursif. Gunakan metode ini jika Anda hanya memerlukan anak langsung sebuah direktori dan ingin menghindari penelusuran ke tingkat yang lebih dalam.
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() — Glob Rekursif
Path.rglob(pattern) menemukan semua berkas yang cocok dengan pola glob secara rekursif. Ini merupakan cara paling ringkas untuk menemukan semua berkas dengan jenis tertentu di mana pun dalam pohon direktori. Tanda ** dalam glob berarti "jumlah direktori berapa pun".
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() — Pencocokan Pola
glob.glob(pattern, recursive=True) merupakan antarmuka glob tradisional. Dengan recursive=True, wildcard ** cocok dengan jalur subdirektori apa pun. Fungsi ini mengembalikan string, sedangkan pathlib.rglob mengembalikan objek 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')Memfilter berdasarkan Ekstensi Berkas
Saat menelusuri direktori, filter berkas berdasarkan ekstensinya menggunakan Path.suffix (yang menyertakan titik, misalnya '.py') atau dengan memeriksanya terhadap sekumpulan ekstensi yang diizinkan. Cara ini lebih cepat dan lebih tepat daripada pola glob untuk pemfilteran dengan banyak ekstensi.
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')Memfilter berdasarkan Ukuran Berkas
Agen terkadang perlu menemukan berkas yang ukurannya di atas atau di bawah ambang tertentu — melewati berkas kosong yang sangat kecil atau menghindari pemrosesan berkas berukuran sangat besar yang dapat membebani memori. Gunakan Path.stat().st_size untuk mendapatkan ukuran berkas dalam 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)}')Memfilter berdasarkan Waktu Modifikasi
Agen dalam alur pemrosesan bertahap hanya perlu memproses berkas yang berubah sejak proses terakhir dijalankan. Gunakan stat().st_mtime (waktu modifikasi sebagai stempel waktu Unix) untuk menemukan berkas yang baru saja dimodifikasi.
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")}')Melewati Berkas Tersembunyi dan Direktori Sistem
Saat menelusuri repositori kode atau direktori pengguna, lewati berkas tersembunyi (yang diawali .) dan direktori sistem seperti .git, __pycache__, node_modules, dan .venv. Direktori tersebut berisi ribuan berkas yang tidak relevan bagi sebagian besar agen.
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')Membangun Inventaris Berkas
Inventaris berkas adalah ringkasan terstruktur dari pohon direktori — berguna bagi agen yang perlu merencanakan pekerjaan sebelum memprosesnya. Kumpulkan nama, jalur, ukuran, ekstensi, dan waktu modifikasi ke dalam daftar kamus yang dapat diserialisasikan ke 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')Memantau Direktori untuk Perubahan
Beberapa agen perlu bereaksi saat berkas baru muncul dalam direktori. Meskipun pustaka pemantau berkas lengkap seperti watchdog paling tepat untuk produksi, pendekatan sederhana adalah memindai direktori secara berkala dan membandingkan hasilnya dengan sekumpulan berkas yang telah diketahui.
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)
Pemeriksaan Cepat: rglob vs iterdir
Uji pemahaman Anda tentang metode penelusuran direktori.
Ringkasan Penelusuran Direktori
Sekarang Anda dapat menemukan berkas apa pun yang diperlukan agen Anda:
- os.walk() — kendali penuh atas penelusuran rekursif; ubah
dirnamessecara langsung untuk memangkas subdirektori - Path.iterdir() — daftar satu tingkat yang berisi anak langsung
- Path.rglob('*.ext') — pencarian rekursif berdasarkan pola yang paling bersih
- glob.glob('**/*.ext', recursive=True) — alternatif tradisional yang mengembalikan string
- Filter berdasarkan
.suffixuntuk ekstensi,.stat().st_sizeuntuk ukuran, dan.stat().st_mtimeuntuk waktu modifikasi - Selalu lewati berkas tersembunyi dan direktori sistem seperti
.gitdannode_modules
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penelusuran Direktori dan Penemuan File” gratis?
Ya — teks lengkap “Penelusuran Direktori dan Penemuan File” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penelusuran Direktori dan Penemuan File”?
os.walk(), pola glob, dan penyaringan file berdasarkan jenis atau tanggal. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Penelusuran Direktori dan Penemuan File” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membaca dan Menulis File dalam Konteks Agen
- Penelusuran Direktori dan Penemuan File
- Penanganan Format File: CSV, JSON, dan TXT
- Operasi File yang Aman dengan Penanganan Error