json.dumps,json.loads,json.dump,json.loadile Python nesnelerini JSON'a çevirmek ve geri almak- CSV'yi
csv.readervecsv.DictReaderile okumak,csv.writerveDictWriterile yazmak pathlib.Pathile 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.
| Python | JSON |
|---|---|
dict | nesne {...} |
list, tuple | dizi [...] |
str | metin (çift tırnak içinde) |
int, float | sayı |
True, False, None | true, false, null |
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
]
}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.
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
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.
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.
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.
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.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.
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}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.
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/loadsmetinle,dump/loaddosyayla çalışır; JSON'datrue,false,nullve yalnızca metin anahtarlar vardır.- Azerbaycanca metinler için
ensure_ascii=Falseveencoding='utf-8'; okunurluk içinindent=2. - Tarihler ve kümeler JSON'a doğrudan yazılamaz:
default=strya da ISO metni kullan. - CSV'yi
split(',')ile değil,csvmodü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.
json.dumps({'ok': True, 'x': None}) ne döndürür?