İçeriğe geç
Educora
İleri20 dk25 / 42

JSON ve CSV ile çalışmak

`json` modülüyle veriyi metne çevir ve geri oku, Azerbaycan harflerini `ensure_ascii=False` ile okunur tut, `csv` modülüyle tabloları doğru oku ve yaz, dosyalarla `pathlib` üzerinden çalış.

Kendini test et
Bu derste öğreneceklerin
  • json.dumps, json.loads, json.dump, json.load ile Python nesnelerini JSON'a çevirmek ve geri almak
  • CSV'yi csv.reader ve csv.DictReader ile okumak, csv.writer ve DictWriter ile yazmak
  • pathlib.Path ile yollar oluşturmak, dosya okumak ve yazmak

Şu anda okuduğun bu ders de bir JSON dosyasıdır: web sitesi ve mobil uygulamalar onu aynı dosyadan alır. Programlar veri alışverişini çoğunlukla iki metin biçiminde yapar: web servislerinin, ayar dosyalarının ve API'lerin dili olan JSON ile Excel'den, banka dökümlerinden ve raporlardan gelen tablolar olan CSV. Python'un standart kütüphanesinde ikisi için de hazır modüller vardır.

JSON: metin olarak veri

JSON (JavaScript Object Notation) Python sözlüklerine ve listelerine çok benzer ama birkaç farkı vardır: metinler yalnızca çift tırnakla yazılır, True yerine true, None yerine null kullanılır ve nesne anahtarları her zaman metindir. json.dumps bir Python nesnesini JSON metnine çevirir (serileştirme), json.loads ise tersini yapar.

PythonJSON
dictnesne {...}
list, tupledizi [...]
strmetin (çift tırnak içinde)
int, floatsayı
True, False, Nonetrue, false, null
Python
import json

student = {'name': 'Aysel', 'city': 'Bakı', 'age': 19,
           'grades': [5, 4, 5], 'active': True, 'mentor': None}
text = json.dumps(student)
print(text)
print(json.dumps(student, ensure_ascii=False))
back = json.loads(text)
print(back == student, type(back['grades']).__name__)
print(json.dumps({'city': 'Gəncə', 'grades': [5, 4]}, ensure_ascii=False, indent=2))
▸ Beklenen çıktı
{"name": "Aysel", "city": "Bak\u0131", "age": 19, "grades": [5, 4, 5], "active": true, "mentor": null}
{"name": "Aysel", "city": "Bakı", "age": 19, "grades": [5, 4, 5], "active": true, "mentor": null}
True list
{
  "city": "Gəncə",
  "grades": [
    5,
    4
  ]
}
Python
import json
from datetime import date

data = {1: 'one', 'point': (3, 4)}
text = json.dumps(data)
print(text)
print(json.loads(text))
try:
    json.dumps({'when': date(2026, 9, 1)})
except TypeError as e:
    print('TypeError:', e)
print(json.dumps({'when': date(2026, 9, 1)}, default=str))
▸ Beklenen çıktı
{"1": "one", "point": [3, 4]}
{'1': 'one', 'point': [3, 4]}
TypeError: Object of type date is not JSON serializable
{"when": "2026-09-01"}

pathlib ve JSON dosyaları

pathlib.Path bir dosya yolunu nesne olarak temsil eder: yollar / ile birleştirilir (Path('data') / 'report.json'), read_text ve write_text bir dosyayı tek satırda okur ve yazar, name, stem, suffix adın parçalarını, exists() ise dosyanın var olup olmadığını döndürür. Kod Windows, macOS ve Linux'ta aynı çalışır. Açık dosya nesneleri için json.dump ve json.load vardır.

Python
import json
from pathlib import Path

settings = {'language': 'az', 'theme': 'dark', 'subjects': ['python', 'math']}
path = Path('settings.json')
path.write_text(json.dumps(settings, indent=2), encoding='utf-8')
loaded = json.loads(path.read_text(encoding='utf-8'))
print(loaded['subjects'])

with open(path, 'w', encoding='utf-8') as f:
    json.dump(settings, f, ensure_ascii=False)
with open(path, encoding='utf-8') as f:
    print(json.load(f) == settings)
print(path.name, path.stem, path.suffix, path.exists())
▸ Beklenen çıktı
['python', 'math']
True
settings.json settings .json True
Unutma: dumps / loads metinle, dump / load ise dosyayla çalışır (sondaki “s”, string yani metin demektir).

CSV: csv modülüyle tablolar

CSV basit görünür ama tırnak içindeki bir alan virgül, satır sonu, hatta tırnak işaretinin kendisini içerebilir. csv modülü bu kuralları bilir. csv.reader her satırı liste olarak, csv.DictReader ise başlık satırındaki adlarla sözlük olarak döndürür. Tüm değerler metindir; sayıları kendin dönüştür.

Python
import csv
import io

text = '''name,city,score
Aysel,Bakı,91
Murad,"Gəncə, Azerbaijan",76
Leyla,Sumqayıt,85'''
for row in csv.reader(io.StringIO(text)):
    print(row)
rows = list(csv.DictReader(io.StringIO(text)))
print(rows[1]['city'], '|', type(rows[1]['score']).__name__)
avg = sum(int(r['score']) for r in rows) / len(rows)
print(f'average: {avg:.1f}')
print('Murad,"Gəncə, Azerbaijan",76'.split(','))
▸ Beklenen çıktı
['name', 'city', 'score']
['Aysel', 'Bakı', '91']
['Murad', 'Gəncə, Azerbaijan', '76']
['Leyla', 'Sumqayıt', '85']
Gəncə, Azerbaijan | str
average: 84.0
['Murad', '"Gəncə', ' Azerbaijan"', '76']

Yazmak için csv.writer (listeler) ya da csv.DictWriter (sözlükler) kullanılır. Modül gereken yerlere tırnakları kendisi koyar. Standarda göre satırlar \r\n ile biter; burada sonucu ekrana yazdırmak için lineterminator='\n' veriyoruz.

Python
import csv
import io

rows = [{'product': 'Tea', 'price': 4.5, 'qty': 30},
        {'product': 'Coffee, large', 'price': 6.0, 'qty': 25}]
buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=['product', 'price', 'qty'], lineterminator='\n')
writer.writeheader()
writer.writerows(rows)
print(buf.getvalue(), end='')
buf2 = io.StringIO()
csv.writer(buf2, delimiter=';', lineterminator='\n').writerow(['Tea', '4,5', 30])
print(buf2.getvalue(), end='')
▸ Beklenen çıktı
product,price,qty
Tea,4.5,30
"Coffee, large",6.0,25
Tea;4,5;30

Mini proje: CSV'den JSON raporuna

Notlar bir CSV dosyasında, mobil uygulama ise gruplara göre özeti JSON olarak bekliyor. Program data klasörünü oluşturur, CSV'yi DictReader ile okur, puanları gruplara toplar ve raporu report.json dosyasına yazar.

Python
import csv
import json
from pathlib import Path

folder = Path('data')
folder.mkdir(exist_ok=True)
(folder / 'grades.csv').write_text(
    'name,group,score\nAysel,A,91\nMurad,B,76\nLeyla,A,85\nElvin,B,64\n', encoding='utf-8')

with open(folder / 'grades.csv', newline='', encoding='utf-8') as f:
    rows = list(csv.DictReader(f))

groups = {}
for r in rows:
    groups.setdefault(r['group'], []).append(int(r['score']))
report = {g: {'count': len(s), 'average': round(sum(s) / len(s), 1)} for g, s in groups.items()}

(folder / 'report.json').write_text(json.dumps(report, indent=2), encoding='utf-8')
print((folder / 'report.json').read_text(encoding='utf-8'))
print(sorted(p.name for p in folder.glob('*')))
▸ Beklenen çıktı
{
  "A": {
    "count": 2,
    "average": 88.0
  },
  "B": {
    "count": 2,
    "average": 70.0
  }
}
['grades.csv', 'report.json']
mkdir(exist_ok=True) klasör zaten varsa hata vermez, glob('*') ise klasördeki dosyaları listeler. Tarayıcıda dosyalar bellekteki geçici bir dosya sisteminde durur.
Alıştırma

JSON metnindeki siparişleri oku. İlk satırda tüm siparişlerin toplam tutarını (2 ondalık basamağa yuvarlanmış), ikinci satırda ise şehirlere göre toplamları JSON olarak yazdır: Azerbaycan harfleri kodlanmasın ve anahtarlar sıralansın.

Alıştırma · Python
import json

text = '[{"customer": "Aysel", "city": "Bakı", "total": 45.5}, {"customer": "Murad", "city": "Gəncə", "total": 30.0}, {"customer": "Leyla", "city": "Bakı", "total": 12.5}]'
# 1) total of all orders
# 2) totals by city as JSON (ensure_ascii=False, sort_keys=True)
▸ Beklenen çıktı
88.0
{"Bakı": 58.0, "Gəncə": 30.0}
Alıştırma

CSV'yi csv.DictReader ile oku. İlk satırda her şehirden kaç öğrenci olduğunu sözlük olarak, ikinci satırda ortalama puanı en yüksek olan şehri ve o ortalamayı (boşlukla ayırarak) yazdır.

Alıştırma · Python
import csv
import io

text = '''name,city,score
Aysel,Bakı,91
Murad,Gəncə,76
Leyla,Bakı,85
Elvin,Gəncə,64
Nigar,Sumqayıt,88'''
# count students per city, then find the city with the best average
▸ Beklenen çıktı
{'Bakı': 2, 'Gəncə': 2, 'Sumqayıt': 1}
Bakı 88.0

Önemli noktalar

  • dumps / loads metinle, dump / load dosyayla çalışır; JSON'da true, false, null ve yalnızca metin anahtarlar vardır.
  • Azerbaycanca metinler için ensure_ascii=False ve encoding='utf-8'; okunurluk için indent=2.
  • Tarihler ve kümeler JSON'a doğrudan yazılamaz: default=str ya da ISO metni kullan.
  • CSV'yi split(',') ile değil, csv modülüyle oku ve yaz; dosyaları newline='' ile aç.
  • pathlib.Path: / ile yollar, read_text, write_text, mkdir(exist_ok=True), glob.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
json.dumps({'ok': True, 'x': None}) ne döndürür?