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.DictReaderuntuk baris berbentuk kamus dancsv.DictWriteruntuk keluaran; selalu gunakannewline=''saat membuka berkas - JSON: gunakan
json.load(f)untuk mengurai danjson.dump(obj, f, indent=2)untuk menulis; tangkapJSONDecodeError - 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
- 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