Python ile JSON Dosyası İşleme: Okumak, Yazmak, Düzleştirmek
Beceri rehberi

Python ile JSON Dosyası İşleme: Okumak, Yazmak, Düzleştirmek

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

JSON dosyasını Python sözlüğüne çevirmeyi, değiştirip geri yazmayı, Türkçe karakterleri bozmadan kaydetmeyi ve iç içe yapıyı düz bir tabloya dönüştürmeyi örnek kodlarla öğrenirsiniz.

Bir bakışta

  1. Okumak için load, yazmak için dump kullanılır. Dosyaya değil metne çalışan karşılıkları loads ve dumps adını taşır.
  2. JSON nesnesi Python sözlüğüne, dizisi listeye dönüşür. Metin, sayı, doğru ve yanlış ile null değerlerinin de Python karşılıkları vardır.
  3. Türkçe karakter için kodlamayı ve ensure_ascii seçeneğini bilmek gerekir. Dosyayı UTF-8 ile açmak ve ensure_ascii kapatmak, ş, ğ, ı gibi harflerin kaçış koduna dönüşmesini önler.
  4. Bozuk JSON, JSONDecodeError ile yakalanır ve hatanın yerini söyler. Hatanın satır ve sütunu, kaynak dosyada sorunu bulmayı kolaylaştırır.
  5. İç içe yapı, analiz öncesi düz bir tabloya indirgenir. Sözlükleri özyinelemeli gezen küçük bir işlev ya da pandas'ın hazır aracı bu işi görür.

JSON ve Python veri tipleri

JSON, verinin metin olarak taşındığı yaygın bir biçimdir: web servisleri, ayar dosyaları, uygulama günlükleri ve veri aktarımları bu biçimi kullanır. Python'un standart kütüphanesindeki json modülü, JSON metnini Python nesnelerine ve tersine çevirir. Kurulum gerekmez, yalnızca içe aktarılır:

import json

Çeviri, birebir bir tip eşlemesine dayanır. Python belgesine göre JSON nesnesi sözlüğe (dict), dizisi listeye (list), metni str'ye, sayısı tam sayı ya da ondalık sayıya (int, float), true ve false değerleri True ve False'a, null ise None'a dönüşür. Yazarken de tersi geçerlidir; ayrıca demet (tuple) JSON'da dizi olarak yazılır.

Bu eşlemenin iki sonucu önemlidir. Birincisi, JSON'da anahtarlar her zaman metindir; Python'da sayı anahtarlı bir sözlüğü yazıp geri okursanız anahtarlar metin olarak döner. İkincisi, demet gibi JSON'da karşılığı olmayan tipler gidiş dönüşte listeye dönüşür. Bu yüzden yazıp okuduğunuz veri, tipler açısından aynı olmayabilir.

Şekil 1

Dört işlev: yön (okuma, yazma) ve hedef (metin, dosya)

Okuma (JSON'dan Python'a)Yazma (Python'dan JSON'a)
dumpsPython nesnesini JSON metnine çevirir.
dumpPython nesnesini JSON olarak dosyaya yazar.
loadsJSON metnini Python nesnesine çevirir.
loadDosyadaki JSON'u Python nesnesine okur.
Metinle çalışırDosyayla çalışır
Kaynak: sayfa içeriğiMindset Institute

JSON dosyasını okumak

Dosyadan okumak için open ile dosyayı açıp load çağırırsınız. Türkçe karakterli dosyalarda kodlamayı açıkça belirtmek, işletim sistemine göre değişen varsayılandan kaynaklanan sorunları önler:

with open("musteriler.json", encoding="utf-8") as f: veri = json.load(f)

with bloğu dosyayı iş bitince kendiliğinden kapatır. veri, JSON yapısına göre bir sözlük ya da liste olur. Kök bir dizi ise listedir ve içindeki her öğe genellikle bir sözlüktür:

for musteri in veri: print(musteri["ad"], musteri["sehir"])

Anahtar yoksa KeyError alırsınız. Opsiyonel alanlarda get kullanmak güvenlidir:

telefon = musteri.get("telefon", "yok")

İç içe yapıda adım adım ilerleyin: veri["siparis"]["kalemler"] gibi. Metin olarak gelen JSON için, örneğin bir web servisinin yanıtı için, loads kullanılır:

veri = json.loads(yanit_metni)

loads metin, bayt ya da bayt dizisi alır. Büyük ya da güvenilmeyen kaynaklardan gelen JSON'da işlemci ve bellek kullanımına dikkat edin; belge, çok büyük ya da derin iç içe verinin ciddi kaynak tüketebileceğini belirtir. Okumadan önce boyutu sınırlamak makul bir önlemdir.

JSON dosyasına yazmak

Yazmak için dump kullanılır. Metin döndürmek isterseniz dumps çağırırsınız. En sık kullanılan seçenekler indent, sort_keys ve ensure_ascii'dir:

with open("cikti.json", "w", encoding="utf-8") as f: json.dump(veri, f, ensure_ascii=False, indent="\t")

indent, çıktıyı girintili ve okunur hale getirir; bir tam sayı (boşluk sayısı) ya da bir metin (örneğin sekme) alabilir. sort_keys=True anahtarları sıralar, bu da iki dosyayı karşılaştırırken tutarlı çıktı verir. Girinti vermezseniz çıktı tek satır ve kompakt olur; ağ üzerinden göndermek için bu yeterlidir.

ensure_ascii varsayılan olarak açıktır ve ASCII dışı karakterleri kaçış koduna çevirir: "Zürich" yerine bir kod dizisi yazılır. Türkçe metinde ş, ğ, ı, ö, ü, ç harfleri okunmaz hale gelir. ensure_ascii=False ile bu karakterler olduğu gibi yazılır; ancak dosyayı UTF-8 kodlamasıyla açmak da gerekir, çünkü kodlamayı dosya nesnesi belirler.

Bir dosyaya birden fazla nesne yazmak için dump'ı art arda çağırırsanız geçerli bir JSON oluşmaz; belge bu konuda uyarır. Birden çok kaydı tek dosyada tutmak için onları bir listeye koyup bir kez yazın.

Şekil 2

JSON'daki her tipin Python'da bir karşılığı vardır

JSONPython
Nesneobjectdict (sözlük)
Diziarraylist (liste)
Metinstringstr
Sayınumberint veya float
Mantıksaltrue, falseTrue, False
BoşnullNone
Kaynak: sayfa içeriğiMindset Institute

Hatalı JSON'u yakalamak

Gerçek dünyada JSON her zaman geçerli gelmez: eksik bir virgül, tek tırnak, sonda kalan virgül, kesilmiş bir dosya. Geçersiz JSON okunurken JSONDecodeError oluşur. Bu hata ValueError'ın alt sınıfıdır ve neyin nerede ters gittiğini söyleyen alanlar taşır: msg hata iletisini, pos metindeki karakter konumunu, lineno ve colno ise satır ve sütunu verir.

try: veri = json.loads(metin) except json.JSONDecodeError as hata: print(hata.msg, hata.lineno, hata.colno)

Bu bilgi, kaynak dosyada hatayı bulmayı çok kolaylaştırır. Hata yakalama, hata vermeden önce doğrulama yapmanın da yoludur: dış kaynaktan gelen veride önce yakalayın, anlamlı bir mesajla bildirin ve süreci bozmadan geçin ya da durdurun.

Belge ayrıca birkaç tuzağa işaret eder. Kopya anahtarlar varsa yalnızca son değer korunur. Okuyucu NaN ve Infinity değerlerini kabul eder ama bunlar JSON standardı dışındadır; yazarken bunları reddetmek için allow_nan=False kullanabilirsiniz. Komut satırında python -m json ile bir JSON dosyasını doğrulayıp güzel biçimde yazdırabilirsiniz; bu da hızlı bir kontrol aracıdır.

İç içe veriyi düzleştirmek

Web servislerinden gelen JSON çoğu zaman iç içedir: bir müşterinin adresi bir sözlük, siparişleri bir liste olabilir. Analiz ya da tabloya aktarma için bunu düz bir yapıya indirmek gerekir. Küçük bir özyinelemeli işlev bu işi görür:

def duzlestir(veri, onek=""): sonuc = {} for anahtar, deger in veri.items(): yol = onek + anahtar if isinstance(deger, dict): sonuc.update(duzlestir(deger, yol + ".")) else: sonuc[yol] = deger return sonuc

İşlev bir sözlük içindeki sözlükleri gezer ve anahtarları noktayla birleştirir: adres içindeki sehir alanı adres.sehir olur. Listeleri ayrıca ele almak gerekir: her liste öğesini ayrı satıra açmak (satır çoğaltma) ya da liste olarak bırakmak, analiz amacına bağlıdır.

Tablo odaklı çalışıyorsanız pandas kütüphanesinin json_normalize işlevi iç içe sözlükleri doğrudan düz bir tabloya çevirir ve liste alanlarını ayrı kayıtlara açma seçeneklerini sunar. Birkaç kayıtlık küçük işlerde kendi işlevinizi yazmak yeterlidir; çok sayıda ve düzensiz yapıdaki veride hazır araç zaman kazandırır. Düzleştirmeden önce örnek bir kayıtla yapıyı inceleyin: tüm kayıtlarda aynı alanlar bulunmayabilir.

Sık yapılan hatalar

  • Dosyayı kodlama belirtmeden açmak: Türkçe karakterler bozulur ya da hata çıkar. Açıkça UTF-8 yazın.
  • ensure_ascii'yi kapatmamak: ş, ğ, ı gibi harfler kaçış koduna dönüşür ve dosya okunmaz.
  • load ile loads'u karıştırmak: load dosya nesnesi, loads metin alır. Metne load çağırmak hata verir.
  • Aynı dosyaya art arda dump çağırmak: dosya geçerli JSON olmaz. Kayıtları listede toplayıp bir kez yazın.
  • Anahtarın varlığını varsaymak: eksik alanlarda KeyError çıkar. get ve varsayılan değer kullanın.
  • Tip dönüşümünü unutmak: sayısal anahtarlar metne döner, demet listeye dönüşür.
  • Hata yakalamadan dış kaynaktan okumak: tek bozuk kayıt tüm süreci durdurur.
  • Güvenilmeyen büyük JSON'u doğrudan okumak: bellek ve işlemci tüketimi artabilir; boyutu sınırlayın.
  • Okunaksız tek satır çıktıyı insanlara göstermek: girinti verin.
Şekil 3

Kodlamayı ve kaçış kodunu bilerek Türkçe veriyi korumak

Sık yapılan
Daha sağlıklı
Dosyayı kodlama vermeden açmak
encoding olarak UTF-8 belirtmek
Varsayılan ensure_ascii ile yazmak
ensure_ascii kapalı yazmak
Kayıtları art arda dump ile eklemek
Kayıtları listede toplayıp bir kez yazmak
Kaynak: sayfa içeriğiMindset Institute

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Python ile Robotic Process Automation (RPA) Eğitimi'ndeki CSV ve JSON Otomasyonu, Belge Otomasyonu ve Web Kazıma başlıkları, JSON'u gerçek süreçlerde okuma ve yazma becerisini doğrudan ilgilendirir. Data Science Bootcamp ise dosyalarla çalışmak, istisnalar, veri edinimi ve çıkartma başlıklarıyla JSON gibi dış kaynaklı veriyi analize hazırlamayı kapsar. Otomasyon geliştiricileri ve veri analistleri için uygundur.

İlgili Mindset programı

Python ile Robotic Process Automation ( RPA ) Eğitimi

Sık sorulanlar

Sık sorulan sorular

Python'da JSON dosyası nasıl okunur?

Dosyayı UTF-8 kodlamasıyla with open ile açıp json.load ile okursunuz; sonuç, JSON yapısına göre bir sözlük ya da liste olur. Metin halindeki JSON için json.loads kullanılır. Yanıtı sözlük gibi gezebilirsiniz.

JSON'a yazarken Türkçe karakterler neden bozuluyor?

Varsayılan olarak ensure_ascii açıktır ve ASCII dışı karakterleri kaçış koduna çevirir. ensure_ascii=False verin ve dosyayı UTF-8 kodlamasıyla açın; böylece harfler olduğu gibi yazılır ve okunur kalır.

load ile loads arasındaki fark nedir?

load bir dosya nesnesinden okur, loads ise metin ya da bayt halindeki JSON'u okur. Aynı ayrım yazmada dump ve dumps arasında vardır: dump dosyaya yazar, dumps metin döndürür.

JSON dosyası bozuksa programım çökmeden nasıl devam eder?

Okuma işlemini try ve except ile sarın ve JSONDecodeError'ı yakalayın. Hata nesnesindeki satır ve sütun bilgisiyle sorunu bildirin. Çok kayıtlı işlerde bozuk kaydı kaydedip atlayarak süreci devam ettirebilirsiniz.

İç içe JSON'u tabloya nasıl dönüştürürüm?

Sözlükleri özyinelemeli gezen bir işlev yazabilir ya da pandas'ın json_normalize işlevini kullanabilirsiniz. Listeleri ayrı satırlara açıp açmayacağınıza analiz amacınıza göre karar verin. Dönüşümden önce örnek kayıtlarla yapıyı inceleyin.

Python ile JSON Dosyası Okuma, Yazma ve Düzleştirme