0Pricing
AI Agents · Pelajaran

Penanganan Format File: CSV, JSON, dan TXT

Modul csv, json.load/dump, dan pengodean teks yang aman untuk alat agen.

Penanganan Format File: CSV, JSON, dan TXT adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 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.

Tiga Format Berkas Agen yang Paling Umum

Agen terus-menerus membaca dan menulis tiga format berkas: CSV untuk data tabular, JSON untuk objek terstruktur, dan teks biasa untuk log, perintah, dan laporan. Masing-masing memiliki persyaratan penguraian, kasus khusus, dan praktik terbaik yang berbeda. Python memiliki dukungan bawaan yang sangat baik untuk ketiganya.

import csv
import json
from pathlib import Path

# Detect format from extension
def read_data_file(file_path):
    path = Path(file_path)
    if path.suffix == '.csv':
        return read_csv(path)
    elif path.suffix == '.json':
        return read_json(path)
    elif path.suffix == '.txt':
        return path.read_text(encoding='utf-8')
    else:
        raise ValueError(f'Unsupported format: {path.suffix}')

csv.reader — Penguraian CSV Dasar

csv.reader mengurai berkas CSV baris demi baris dan mengembalikan setiap baris sebagai daftar teks. Fungsi ini menangani bidang yang diberi tanda kutip, koma di dalam bidang, dan baris baru di dalam nilai yang diberi tanda kutip dengan benar — tidak seperti pemisahan berdasarkan koma secara manual yang gagal menangani kasus khusus.

import csv

with open('sales.csv', 'w', newline='') as f:
    f.write('product,qty,price\nWidget,3,9.99\nGadget,1,19.99\n')

with open('sales.csv', 'r', encoding='utf-8', newline='') as f:
    reader = csv.reader(f)
    header = next(reader)
    print('Columns:', header)

    for row in reader:
        product = row[0]
        quantity = int(row[1])
        price = float(row[2])
        print(f'{product}: {quantity} units at ${price}')

csv.DictReader — Baris sebagai Kamus

csv.DictReader membaca setiap baris sebagai OrderedDict (atau kamus biasa dalam Python 3.8+) dengan tajuk kolom sebagai kunci. Cara ini jauh lebih mudah digunakan daripada pengindeksan posisi — kode Anda tetap mudah dibaca meskipun urutan kolom berubah.

import csv

with open('employees.csv', 'w', newline='') as f:
    f.write('name,department,salary\nAlice,Eng,95000\nBob,Sales,70000\n')

with open('employees.csv', 'r', encoding='utf-8', newline='') as f:
    reader = csv.DictReader(f)
    print('Fields:', reader.fieldnames)

    total_salary = 0
    for row in reader:
        name = row['name']
        department = row['department']
        salary = float(row['salary'])
        total_salary += salary
        print(f'{name} ({department}): ${salary:,.2f}')

    print(f'Total payroll: ${total_salary:,.2f}')

csv.writer dan DictWriter — Menulis CSV

Gunakan csv.writer untuk menulis baris sebagai daftar, atau csv.DictWriter untuk menulis baris sebagai kamus. Selalu teruskan newline='' saat membuka berkas — modul csv menangani akhir baris itu sendiri untuk menghindari baris baru ganda di Windows.

import csv

results = [
    {'task_id': 'T001', 'status': 'completed', 'duration_s': 12.5},
    {'task_id': 'T002', 'status': 'failed', 'duration_s': 3.1},
    {'task_id': 'T003', 'status': 'completed', 'duration_s': 45.8},
]

fieldnames = ['task_id', 'status', 'duration_s']

with open('task_results.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()  # write column names
    writer.writerows(results)

print('Wrote task_results.csv')

json.load() dan json.dump() — Operasi Masukan/Keluaran Berkas

Gunakan json.load(file) untuk mengurai berkas JSON dan json.dump(obj, file) untuk menulisnya. Keduanya bekerja dengan objek berkas. Gunakan json.loads(string) dan json.dumps(obj) untuk string. Selalu gunakan indent=2 agar keluaran mudah dibaca.

import json

with open('config.json', 'w', encoding='utf-8') as f:
    json.dump({'api_url': 'https://api.example.com', 'timeout': 15}, f)

with open('config.json', 'r', encoding='utf-8') as f:
    config = json.load(f)

print('API URL:', config.get('api_url'))
print('Timeout:', config.get('timeout', 30))

output_data = {
    'run_id': 'abc123',
    'items': [1, 2, 3],
    'meta': {'agent': 'v2', 'model': 'gpt-4o'}
}

with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(
        output_data, f,
        indent=2,
        ensure_ascii=False
    )
print('Written output.json')

Menangani Galat Penguraian JSON

Berkas JSON yang tidak valid sering ditemukan dalam alur pemrosesan agen — penulisan yang tidak selesai, unduhan yang terpotong, atau masalah pengodean. Selalu bungkus json.load() dalam try/except dan berikan pesan galat yang jelas serta menyertakan jalur berkas untuk keperluan penelusuran.

import json
from pathlib import Path

def safe_load_json(file_path):
    path = Path(file_path)
    try:
        with open(path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except json.JSONDecodeError as e:
        print(f'Invalid JSON in {path}: line {e.lineno}, col {e.colno}')
        print(f'  Error: {e.msg}')
        # Show the problem area
        content = path.read_text(encoding='utf-8')
        lines = content.split('\n')
        if e.lineno <= len(lines):
            print(f'  Content: {lines[e.lineno-1][:80]}')
        return None
    except FileNotFoundError:
        print(f'File not found: {path}')
        return None

# --- demo ---
Path('good.json').write_text('{"model": "gpt-4o"}', encoding='utf-8')
Path('bad.json').write_text('{"model": "gpt-4o", }', encoding='utf-8')

print('Loading good.json:', safe_load_json('good.json'))
print('Loading bad.json:', safe_load_json('bad.json'))

Membaca Format JSONL (JSON Lines)

Banyak API AI dan alur pemrosesan data menggunakan JSONL (JSON Lines) — satu objek JSON per baris. Format ini mendukung pemrosesan aliran dan mudah diproses baris demi baris tanpa memuat seluruh berkas ke memori. Setiap baris merupakan objek JSON yang lengkap dan mandiri.

import json

with open('events.jsonl', 'w', encoding='utf-8') as f:
    f.write('{"event": "start"}\n{"event": "stop"}\nnot json\n')

results = []
with open('events.jsonl', 'r', encoding='utf-8') as f:
    for line_num, line in enumerate(f, 1):
        line = line.strip()
        if not line:
            continue
        try:
            event = json.loads(line)
            results.append(event)
        except json.JSONDecodeError as e:
            print(f'Bad JSON on line {line_num}: {e}')

print(f'Loaded {len(results)} events')

with open('output.jsonl', 'w', encoding='utf-8') as f:
    for record in results:
        f.write(json.dumps(record, ensure_ascii=False) + '\n')

Membaca Berkas Teks Biasa

Teks biasa adalah format paling sederhana — log, perintah, laporan, dan berkas konfigurasi. Baca seluruh berkas dengan .read(), atau proses baris demi baris. Untuk berkas besar, selalu gunakan pendekatan baris demi baris agar penggunaan memori tetap konstan.

from pathlib import Path

Path('system_prompt.txt').write_text('You are a helpful agent.', encoding='utf-8')
with open('agent.log', 'w', encoding='utf-8') as f:
    f.write('INFO: boot\nERROR: disk full\nCRITICAL: crash\nINFO: recovered\n')

prompt = Path('system_prompt.txt').read_text(encoding='utf-8')
print(f'Prompt length: {len(prompt)} characters')

error_lines = []
with open('agent.log', 'r', encoding='utf-8') as f:
    for line in f:
        line = line.rstrip()
        if not line:
            continue
        if 'ERROR' in line or 'CRITICAL' in line:
            error_lines.append(line)

print(f'Found {len(error_lines)} error lines')

with open('summary.txt', 'w', encoding='utf-8') as f:
    f.write('Agent Run Summary\n')
    f.write('=' * 40 + '\n')
    for error in error_lines[:10]:
        f.write(f'  {error}\n')
print('Summary written')

Menangani BOM (Penanda Urutan Byte)

Berkas yang diekspor dari Excel atau alat Windows sering diawali dengan BOM (Penanda Urutan Byte) — karakter \ufeff yang tidak terlihat. Jika tidak ditangani, karakter ini merusak nama bidang pertama dalam penguraian CSV. Gunakan encoding='utf-8-sig' untuk menghapusnya secara otomatis.

import csv

with open('windows_export.csv', 'wb') as f:
    f.write('name,email,age\nAlice,alice@x.com,30\n'.encode('utf-8'))
with open('file.txt', 'wb') as f:
    f.write(b'\xef\xbb\xbfhello')

with open('windows_export.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    first = next(reader)
    print(list(first.keys()))

with open('windows_export.csv', 'r', encoding='utf-8-sig') as f:
    reader = csv.DictReader(f)
    first = next(reader)
    print(list(first.keys()))

content = open('file.txt', 'rb').read()
if content.startswith(b'\xef\xbb\xbf'):
    content = content[3:]
text = content.decode('utf-8')
print('Decoded:', text)

Menangani Galat Pengodean

Saat membaca berkas dari sumber yang tidak diketahui, galat pengodean sering terjadi. Parameter errors dari open() mengatur tindakan yang dilakukan: 'replace' mengganti karakter bermasalah dengan ?, 'ignore' menghapusnya, dan 'backslashreplace' melakukan escape terhadapnya. Untuk validasi ketat, gunakan 'strict' (nilai bawaan).

from pathlib import Path

def read_with_fallback(file_path):
    path = Path(file_path)

    # Try UTF-8 first
    try:
        return path.read_text(encoding='utf-8')
    except UnicodeDecodeError:
        pass

    # Try Latin-1 (handles most European files)
    try:
        return path.read_text(encoding='latin-1')
    except UnicodeDecodeError:
        pass

    # Last resort: replace bad characters
    text = path.read_text(encoding='utf-8', errors='replace')
    print(f'Warning: {path.name} had encoding errors (chars replaced)')
    return text

# --- demo ---
Path('notes_utf8.txt').write_text('Notes: café, naïve, résumé', encoding='utf-8')
text = read_with_fallback('notes_utf8.txt')
print(f'Read {len(text)} chars: {text!r}')

Menangani Berkas CSV yang Tidak Valid

Berkas CSV di dunia nyata memiliki berbagai masalah: koma tambahan, bidang yang hilang, penggunaan tanda kutip yang tidak konsisten, atau pembatas yang bercampur. Gunakan opsi quoting dan error_bad_lines, lalu bungkus penguraian baris dalam try/except agar baris yang bermasalah dapat dilewati dengan baik.

import csv

with open('messy_data.csv', 'w', newline='') as f:
    f.write('name,email,score\nAlice,alice@x.com,88\nBob,,90\nCarol,carol@x.com,notanumber\n')

valid_rows = []
error_count = 0

with open('messy_data.csv', 'r', encoding='utf-8', newline='') as f:
    reader = csv.DictReader(f)
    expected_fields = {'name', 'email', 'score'}

    for line_num, row in enumerate(reader, start=2):
        try:
            if not all(row.get(f, '').strip() for f in expected_fields):
                raise ValueError(f'Missing required field in row {line_num}')
            score = float(row['score'])
            valid_rows.append({
                'name': row['name'].strip(),
                'email': row['email'].strip().lower(),
                'score': score
            })
        except (ValueError, KeyError) as e:
            error_count += 1
            print(f'Skipping row {line_num}: {e}')

print(f'Valid: {len(valid_rows)}, Errors: {error_count}')

Pemeriksaan Cepat: CSV DictReader vs reader

Uji pemahaman Anda tentang opsi penguraian CSV.

Ringkasan Penanganan Format Berkas

Sekarang Anda dapat mengurai dan menulis semua format berkas agen utama:

  • CSV: gunakan csv.DictReader untuk baris berbentuk kamus dan csv.DictWriter untuk keluaran; selalu gunakan newline='' saat membuka berkas
  • JSON: gunakan json.load(f) untuk mengurai dan json.dump(obj, f, indent=2) untuk menulis; tangkap JSONDecodeError
  • JSONL: baca dan urai setiap baris dengan json.loads(line); sangat cocok untuk data yang dialirkan
  • Teks biasa: gunakan .read() untuk berkas kecil dan iterasi baris untuk berkas besar
  • BOM: gunakan encoding='utf-8-sig' untuk berkas yang diekspor dari Windows
  • Galat pengodean: coba UTF-8, beralih ke latin-1, atau gunakan errors='replace'

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penanganan Format File: CSV, JSON, dan TXT” gratis?

Ya — teks lengkap “Penanganan Format File: CSV, JSON, dan TXT” 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 “Penanganan Format File: CSV, JSON, dan TXT”?

Modul csv, json.load/dump, dan pengodean teks yang aman untuk alat agen. 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 3 dari 4.

Berapa lama pelajaran “Penanganan Format File: CSV, JSON, dan TXT” 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