0Pricing
AI Agents · Pelajaran

Operasi File yang Aman dengan Penanganan Error

Periksa keberadaan dan izin file, lalu tangani error IO dengan baik.

Operasi File yang Aman dengan Penanganan Error adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 4 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 Operasi Berkas yang Aman Itu Penting

Operasi berkas dalam agen dapat gagal dengan berbagai cara: berkas tidak ada, agen tidak memiliki izin, jalurnya merupakan direktori, atau ruang disk habis di tengah penulisan. Agen yang mengalami kerusakan akibat galat berkas akan meninggalkan keluaran sebagian dan keadaan yang rusak. Pemrograman defensif dengan pemeriksaan dan penanganan galat yang tepat membuat agen lebih tangguh.

from pathlib import Path

# Unsafe: crashes with FileNotFoundError
# content = Path('missing.txt').read_text()

# Safe: check first
path = Path('config.json')
if path.exists():
    content = path.read_text(encoding='utf-8')
    print('Loaded config')
else:
    print(f'Config not found at {path.resolve()}')
    content = '{}'  # use default

Path.exists() dan Path.is_file()

Sebelum membaca file, periksa bahwa file tersebut ada dan benar-benar merupakan file biasa (bukan direktori, tautan simbolis ke direktori, atau file khusus). Path.exists() mengembalikan True untuk objek apa pun di sistem file; Path.is_file() hanya mengembalikan True untuk file biasa.

from pathlib import Path

path = Path('data/report.csv')

# Chain of checks
if not path.exists():
    print(f'Not found: {path}')
elif not path.is_file():
    print(f'Not a regular file: {path} (is_dir={path.is_dir()})')
elif path.stat().st_size == 0:
    print(f'File is empty: {path}')
else:
    # Safe to read
    import csv
    with open(path, 'r', encoding='utf-8', newline='') as f:
        reader = csv.DictReader(f)
        rows = list(reader)
    print(f'Read {len(rows)} rows')

os.access() — Memeriksa Izin

os.access(path, mode) memeriksa apakah proses saat ini memiliki izin yang ditentukan pada sebuah file. Gunakan os.R_OK untuk membaca, os.W_OK untuk menulis, dan os.X_OK untuk mengeksekusi. Ini berguna sebelum mencoba operasi yang memerlukan izin tertentu.

import os
from pathlib import Path

def check_file_access(path):
    p = Path(path)

    checks = {
        'exists': p.exists(),
        'is_file': p.is_file(),
        'readable': os.access(p, os.R_OK),
        'writable': os.access(p, os.W_OK),
    }

    for check, result in checks.items():
        status = 'OK' if result else 'FAIL'
        print(f'  {check}: {status}')

    return all(checks.values())

if check_file_access('data/input.json'):
    print('File is accessible')
else:
    print('Access problem — check path and permissions')

Menangani FileNotFoundError

FileNotFoundError (subkelas dari OSError) muncul saat Anda mencoba membuka file yang tidak ada. Tangkap secara eksplisit dan berikan pesan error yang berguna, termasuk jalur yang diharapkan, agar pengguna atau operator mengetahui dengan tepat apa yang hilang.

import json
from pathlib import Path

def load_agent_config(config_path='agent_config.json'):
    path = Path(config_path)
    try:
        with open(path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except FileNotFoundError:
        print(f'Config file not found: {path.resolve()}')
        print('Create agent_config.json with your settings')
        print('Example: {"model": "gpt-4o", "max_retries": 3}')
        return {}  # return empty config as default
    except json.JSONDecodeError as e:
        print(f'Invalid JSON in {path}: {e}')
        return {}

# --- demo ---
config = load_agent_config('does_not_exist_config.json')
print(f'Config used: {config}')

Menangani PermissionError

PermissionError muncul saat proses tidak memiliki izin untuk membaca atau menulis file. Hal ini dapat terjadi pada file sistem, file yang dimiliki pengguna lain, atau file dengan izin yang ketat. Selalu tangkap secara terpisah dari FileNotFoundError — keduanya memerlukan respons yang berbeda.

from pathlib import Path

def read_file_safely(path):
    try:
        return Path(path).read_text(encoding='utf-8')
    except FileNotFoundError:
        print(f'File not found: {path}')
        return None
    except PermissionError:
        import os
        print(f'Permission denied: {path}')
        print(f'File permissions: {oct(Path(path).stat().st_mode)}')
        print(f'Current user: {os.getlogin()}')
        print('Try: chmod +r ' + str(path))
        return None
    except IsADirectoryError:
        print(f'Path is a directory, not a file: {path}')
        return None

# --- demo ---
import os
print(read_file_safely('does_not_exist.txt'))

os.makedirs('a_directory', exist_ok=True)
print(read_file_safely('a_directory'))

Menangani IsADirectoryError

IsADirectoryError muncul saat Anda mencoba membuka direktori seolah-olah direktori tersebut adalah file. Hal ini dapat terjadi saat agen menyusun jalur secara keliru — misalnya, menambahkan nama file yang ternyata sudah ada sebagai direktori. Selalu tangkap error ini agar output error yang diberikan bermakna.

from pathlib import Path

def safe_write(output_path, content):
    path = Path(output_path)

    # Check the path is not an existing directory
    if path.is_dir():
        raise IsADirectoryError(
            f'Cannot write file: {path} is a directory. '
            f'Use a filename like {path}/output.txt instead.'
        )

    # Ensure parent directory exists
    path.parent.mkdir(parents=True, exist_ok=True)

    try:
        path.write_text(content, encoding='utf-8')
        print(f'Written: {path} ({len(content)} chars)')
    except IsADirectoryError as e:
        print(f'Path error: {e}')
    except PermissionError:
        print(f'Cannot write to {path} — permission denied')

# --- demo ---
import os
safe_write('demo_output/report.txt', 'Agent finished the task.')

os.makedirs('already_a_dir', exist_ok=True)
try:
    safe_write('already_a_dir', 'this will fail')
except IsADirectoryError as e:
    print(f'Rejected: {e}')

Penulisan Atomik dengan tempfile

Menulis langsung ke file berbahaya — jika agen mogok di tengah penulisan, file tersebut akan tersisa dalam keadaan ditulis sebagian dan rusak. Solusinya adalah penulisan atomik: tulis ke file sementara terlebih dahulu, lalu ubah namanya menjadi jalur akhir. Pengubahan nama bersifat atomik pada sistem POSIX — file akhir akan berupa versi lama atau versi baru, tidak pernah berupa versi yang ditulis sebagian.

import tempfile
import os
import json
from pathlib import Path

def atomic_write_json(file_path, data):
    path = Path(file_path)
    path.parent.mkdir(parents=True, exist_ok=True)

    # Write to temp file in same directory
    tmp_fd, tmp_path = tempfile.mkstemp(
        dir=path.parent,
        prefix='.tmp_',
        suffix='.json'
    )
    try:
        with os.fdopen(tmp_fd, 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
        # Atomic rename: replaces final file in one operation
        os.replace(tmp_path, path)
        print(f'Atomically wrote: {path}')
    except Exception as e:
        os.unlink(tmp_path)  # clean up temp file on error
        raise

# --- demo ---
atomic_write_json('demo_state/state.json', {'step': 3, 'status': 'running'})
print('File contents:', Path('demo_state/state.json').read_text(encoding='utf-8'))

Penguncian File untuk Agen Konkuren

Saat beberapa instans agen berjalan secara paralel dan menulis ke file yang sama, kondisi balapan dapat merusak data. Gunakan penguncian file dengan modul fcntl (Linux/macOS) atau pustaka penguncian file lintas platform untuk mencegah penulisan secara bersamaan.

from filelock import FileLock, Timeout
import json
from pathlib import Path

COUNTER_FILE = Path('shared_counter.json')
LOCK_FILE = Path('shared_counter.json.lock')

def increment_counter():
    lock = FileLock(str(LOCK_FILE), timeout=10)
    try:
        with lock:
            # Only one process can be here at a time
            if COUNTER_FILE.exists():
                data = json.loads(COUNTER_FILE.read_text())
            else:
                data = {'count': 0}

            data['count'] += 1
            COUNTER_FILE.write_text(
                json.dumps(data, indent=2)
            )
            return data['count']
    except Timeout:
        print('Could not acquire lock within 10 seconds')
        return None

Penghapusan Aman dengan Pemeriksaan Keberadaan

Menghapus file yang tidak ada akan memunculkan FileNotFoundError. Menghapus direktori dengan Path.unlink() akan memunculkan IsADirectoryError. Gunakan Path.unlink(missing_ok=True) (Python 3.8+) atau periksa keberadaan terlebih dahulu untuk melakukan penghapusan dengan aman.

from pathlib import Path
import shutil

# Safe file deletion (Python 3.8+)
Path('temp_output.json').unlink(missing_ok=True)

# Safe directory deletion
def safe_remove(path):
    p = Path(path)
    if not p.exists():
        print(f'Already gone: {p}')
        return
    if p.is_file():
        p.unlink()
        print(f'Deleted file: {p}')
    elif p.is_dir():
        shutil.rmtree(p)
        print(f'Deleted directory: {p}')
    else:
        print(f'Unknown file type: {p}')

# Clean up temporary workspace
safe_remove('/tmp/agent_workspace/run_001')

Memeriksa Ruang Disk Sebelum Menulis

Agen yang menulis file besar (output AI, set data, log) sebaiknya memeriksa ruang disk yang tersedia terlebih dahulu. shutil.disk_usage(path) mengembalikan jumlah byte total, terpakai, dan bebas. Pastikan ruang bebas melebihi ukuran output yang diperkirakan sebelum memulai operasi penulisan yang panjang.

import shutil
from pathlib import Path

def check_disk_space(output_dir, required_bytes):
    path = Path(output_dir)
    path.mkdir(parents=True, exist_ok=True)

    usage = shutil.disk_usage(path)
    free_gb = usage.free / (1024 ** 3)
    required_gb = required_bytes / (1024 ** 3)

    print(f'Disk free: {free_gb:.2f} GB')
    print(f'Required:  {required_gb:.2f} GB')

    if usage.free < required_bytes * 1.1:  # 10% safety margin
        raise IOError(
            f'Insufficient disk space: '
            f'{free_gb:.2f} GB free, '
            f'{required_gb:.2f} GB required'
        )
    return True

# Before writing a 500 MB dataset
check_disk_space('/tmp/output', 500 * 1024 * 1024)

Mencadangkan Sebelum Menimpa

Saat agen memperbarui file yang sudah ada, sebaiknya simpan cadangan versi sebelumnya. Dengan begitu, Anda dapat melakukan pemulihan jika konten baru ternyata salah. Gunakan nama file cadangan yang menyertakan penanda waktu dan batasi jumlah cadangan agar ruang disk tidak penuh.

import shutil
import datetime
from pathlib import Path

def write_with_backup(file_path, content, max_backups=5):
    path = Path(file_path)
    backup_dir = path.parent / '.backups'
    backup_dir.mkdir(exist_ok=True)

    # Backup existing file
    if path.exists():
        timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
        backup = backup_dir / f'{path.name}.{timestamp}'
        shutil.copy2(path, backup)
        print(f'Backed up to: {backup}')

    # Write new content
    path.write_text(content, encoding='utf-8')

    # Prune old backups
    backups = sorted(backup_dir.glob(f'{path.name}.*'))
    for old in backups[:-max_backups]:
        old.unlink()
        print(f'Pruned old backup: {old.name}')

# --- demo ---
write_with_backup('demo_notes.txt', 'version 1')
write_with_backup('demo_notes.txt', 'version 2')
print('Backups:', [p.name for p in sorted(Path('.backups').glob('demo_notes.txt.*'))])

Pemeriksaan Singkat: Penulisan Atomik

Uji pemahaman Anda tentang pola penulisan file yang aman.

Ringkasan Operasi File yang Aman

Agen Anda kini dapat menangani file secara defensif:

  • Periksa sebelum mengakses: Path.exists() + Path.is_file() + os.access(path, os.R_OK)
  • Tangkap FileNotFoundError, PermissionError, dan IsADirectoryError dengan pesan yang jelas
  • Gunakan penulisan atomik (tempfile + os.replace) untuk mencegah file ditulis sebagian atau rusak saat terjadi mogok
  • Gunakan penguncian file (pustaka penguncian file) saat beberapa agen menulis ke file yang sama
  • Gunakan missing_ok=True untuk menghapus dengan aman tanpa FileNotFoundError
  • Periksa ruang disk sebelum penulisan besar; simpan cadangan sebelum menimpa file penting

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Operasi File yang Aman dengan Penanganan Error” gratis?

Ya — teks lengkap “Operasi File yang Aman dengan Penanganan Error” 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 “Operasi File yang Aman dengan Penanganan Error”?

Periksa keberadaan dan izin file, lalu tangani error IO dengan baik. 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 4 dari 4.

Berapa lama pelajaran “Operasi File yang Aman dengan Penanganan Error” 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

  1. Membaca dan Menulis File dalam Konteks Agen
  2. Penelusuran Direktori dan Penemuan File
  3. Penanganan Format File: CSV, JSON, dan TXT
  4. Operasi File yang Aman dengan Penanganan Error
← Kembali ke AI Agents