AI Agents · Ders

Dosya Biçimi İşleme: CSV, JSON ve TXT

csv modülü, json.load/dump ve aracı araçları için güvenli metin kodlaması.

3. ders / 413 adım

Dosya Biçimi İşleme: CSV, JSON ve TXT, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 3. 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ın En Yaygın Üç Dosya Biçimi

Ajanlar sürekli olarak üç dosya biçimini okur ve yazar: tablo verileri için CSV, yapılandırılmış nesneler için JSON ve günlükler, istemler ile raporlar için düz metin. Her birinin farklı ayrıştırma gereksinimleri, uç durumları ve en iyi uygulamaları vardır. Python, üçünün de tümü için mükemmel yerleşik destek sunar.

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 — Temel CSV Ayrıştırma

csv.reader, bir CSV dosyasını satır satır ayrıştırır ve her satırı dizelerden oluşan bir liste olarak döndürür. Tırnak içine alınmış alanları, alanların içindeki virgülleri ve tırnak içine alınmış değerlerin içindeki satır sonlarını doğru biçimde yönetir; kenar durumlarında bozulan virgüllere göre elle bölme yönteminin aksine.

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 — Satırın Sözlük Olarak Okunması

csv.DictReader, her satırı sütun başlıklarının anahtar olarak kullanıldığı bir OrderedDict (veya Python 3.8 ve sonraki sürümlerde normal bir dict) olarak okur. Bu yöntem konum tabanlı indekslemeden çok daha kolaydır; sütunların sırası değişse bile kodunuz okunabilirliğini korur.

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 ve DictWriter — CSV Yazma

Satırları liste olarak yazmak için csv.writer, sözlük olarak yazmak için csv.DictWriter kullanın. Dosyayı açarken her zaman newline='' geçirin; csv modülü, Windows'ta çift satır sonlarını önlemek için satır sonlarını kendisi yönetir.

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() ve json.dump() — Dosya Girdi/Çıktısı

Bir JSON dosyasını ayrıştırmak için json.load(file), dosyaya yazmak için json.dump(obj, file) kullanın. Bunlar dosya nesneleriyle çalışır. Dizeler için json.loads(string) ve json.dumps(obj) kullanın. Okunabilir çıktı için her zaman indent=2 belirtin.

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')

JSON Ayrıştırma Hatalarını Yönetme

Bozuk biçimli JSON dosyaları, ajan işlem hatlarında yaygındır; bunun nedeni tamamlanmamış yazma işlemleri, kesilmiş indirmeler veya kodlama sorunları olabilir. json.load() işlemini her zaman bir try/except bloğuna alın ve hata ayıklamayı kolaylaştırmak için dosya yolunu içeren açık hata iletileri sağlayın.

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'))

JSONL (JSON Lines) Biçimini Okuma

Birçok yapay zekâ API'si ve veri işlem hattı, her satırda bir JSON nesnesi bulunan JSONL (JSON Lines) biçimini kullanır. Bu biçim akışı destekler ve dosyanın tamamını belleğe yüklemeden satır satır işlenmesi kolaydır. Her satır eksiksiz ve kendi içinde bağımsız bir JSON nesnesidir.

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')

Düz Metin Dosyalarını Okuma

Düz metin en basit biçimdir; günlükler, istemler, raporlar ve yapılandırma dosyaları bu biçimi kullanır. Dosyanın tamamını .read() ile okuyabilir veya satır satır işleyebilirsiniz. Büyük dosyalarda bellek kullanımını sabit tutmak için her zaman satır satır yaklaşımı kullanın.

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')

BOM (Bayt Sırası İşareti) Yönetimi

Excel'den veya Windows araçlarından dışa aktarılan dosyalar genellikle BOM (Byte Order Mark) ile, yani görünmez bir \ufeff karakteriyle başlar. Bu karakter işlenmezse CSV ayrıştırma sırasında ilk alan adını bozar. Otomatik olarak kaldırmak için encoding='utf-8-sig' kullanın.

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)

Kodlama Hatalarını Yönetme

Bilinmeyen kaynaklardan dosya okurken kodlama hataları yaygındır. open() işlevinin errors parametresi ne olacağını denetler: 'replace' hatalı karakterleri ? ile değiştirir, 'ignore' bunları yok sayar ve 'backslashreplace' bunları kaçış dizileriyle gösterir. Sıkı doğrulama için 'strict' kullanın; bu varsayılan değerdir.

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}')

Bozuk Biçimli CSV Dosyalarını Yönetme

Gerçek dünyadaki CSV dosyalarında fazladan virgüller, eksik alanlar, tutarsız tırnak kullanımı veya karışık ayraçlar bulunabilir. quoting ve error_bad_lines seçeneklerini kullanın ve hatalı satırları sorunsuzca atlamak için satır ayrıştırmayı try/except bloğuna alın.

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}')

Hızlı Kontrol: CSV DictReader ve reader Karşılaştırması

CSV ayrıştırma seçeneklerini anlayıp anlamadığınızı sınayın.

Dosya Biçimi İşleme Özeti

Artık tüm temel ajan dosyası biçimlerini ayrıştırıp yazabilirsiniz:

  • CSV: Sözlük biçimindeki satırlar için csv.DictReader, çıktı için csv.DictWriter kullanın; açarken her zaman newline='' belirtin
  • JSON: Ayrıştırmak için json.load(f), yazmak için json.dump(obj, f, indent=2) kullanın; JSONDecodeError hatasını yakalayın
  • JSONL: Her satırı json.loads(line) ile okuyup ayrıştırın; akış verileri için idealdir
  • Düz metin: Küçük dosyalar için .read(), büyük dosyalar için satır satır yineleme kullanın
  • BOM: Windows'tan dışa aktarılan dosyalar için encoding='utf-8-sig' kullanın
  • Kodlama hataları: UTF-8'i deneyin, latin-1'e geri dönün veya errors='replace' kullanın
Başlamak ücretsiz

Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
60
Dersler
239

Sıkça Sorulan Sorular

“Dosya Biçimi İşleme: CSV, JSON ve TXT” dersi ücretsiz mi?

Evet — “Dosya Biçimi İşleme: CSV, JSON ve TXT” 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.

“Dosya Biçimi İşleme: CSV, JSON ve TXT” dersinde ne öğreneceğim?

csv modülü, json.load/dump ve aracı araçları için güvenli metin kodlaması. 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 3. dersidir.

“Dosya Biçimi İşleme: CSV, JSON ve TXT” 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

  1. Aracı Bağlamında Dosya Okuma ve Yazma
  2. Dizin Geçişi ve Dosya Keşfi
  3. Dosya Biçimi İşleme: CSV, JSON ve TXT
  4. Hata İşleme ile Güvenli Dosya İşlemleri
← AI Agents Sayfasına Dön