Python JSON dosyası güncelleme, dosyayı metin olarak parça parça düzenlemek yerine JSON verisini Python nesnesine alıp kontrollü biçimde yeniden yazma işlemidir. Dosyayı with open ile "r" kipinde ve encoding="utf-8" kullanarak açar, json.load ile Python nesnesine dönüştürür, beklenen kökü ve alanları kontrol eder, ardından hedef değeri değiştirirsin. Son aşamada dosyayı "w" kipinde açıp json.dump ile güncellenmiş nesnenin tamamını yeniden kaydeder ve dosyayı tekrar okuyarak sonucu doğrularsın.
Özetle, json.load dosyayı Python nesnesine çevirir, json.dump ise güncellenmiş nesneyi yeniden JSON olarak kaydeder. Bu akış, doğrulanmış Python nesnesini yeniden yazmaya dayanır. "w" kipi mevcut içeriğin üzerine yazdığı için yazma aşaması, okuma ve doğrulama tamamlandıktan sonra başlatılmalıdır.
Python JSON dosyası güncelleme akışı nasıl çalışır?
İlk adımda JSON dosyasının en dışındaki yapının beklenen türde olup olmadığını kontrol et. Örneğin sözlük beklenen bir dosyada listeyle karşılaşırsan ya da hedef anahtar bulunmuyorsa değişiklik yapmadan işlemi durdurabilirsin. Hedef değer, Python nesnesi üzerinde değiştirildikten sonra json.dump ile dosyanın tamamı yeniden yazılır. Bu, yalnızca tek bir satırı değiştirmek değil, güncellenmiş veri yapısını yeniden JSON biçimine dönüştürmektir.
Kaydetme sonrasında dosyayı yeniden "r" kipinde okumak, yazılan içeriğin tekrar çözümlenebildiğini ve değişikliğin dosyaya yansıdığını kontrol etmeyi sağlar. Python temellerini pekiştirmek için ücretsiz Sıfırdan Temel Python video eğitimi içeriğinden yararlanabilirsin.
json.load, json.dump, r ve w kipleri ne işe yarar?

with open, dosyayı belirli bir kip ve kodlamayla açar; işlem bloğu tamamlandığında dosyanın kapatılmasını düzenler. json.load açık dosya nesnesindeki JSON içeriğini sözlük veya liste gibi bir Python nesnesine alır. Bu nesne üzerinde değişiklik yaptıktan sonra json.dump, nesneyi açık dosyaya JSON biçiminde yazar.
"r" kipi okuma içindir. "w" kipi ise dosyanın mevcut içeriğini temizleyip yeniden yazmaya hazırlar. Bu nedenle dosyayı "w" ile açmadan önce okuma, JSON çözümleme ve alan doğrulama adımları tamamlanmalıdır. Hem okuma hem yazma sırasında encoding="utf-8" belirtmek, Türkçe karakter içeren verilerin tutarlı işlenmesine yardımcı olur. indent=2 çıktıyı girintili ve okunabilir hâle getirir; ensure_ascii=False ise Türkçe karakterlerin kaçış dizileri yerine daha okunabilir görünmesine yardımcı olur.
| Bileşen | Görevi | Akıştaki yeri | Dikkat |
|---|---|---|---|
with open ile "r" |
JSON dosyasını okumak için açar. | Güncellemenin başlangıcı | encoding="utf-8" açıkça belirtilmelidir. |
json.load |
Dosyadaki JSON'u Python nesnesine dönüştürür. | Okuma ve doğrulama | Kök yapı ve hedef alan kontrol edilmelidir. |
with open ile "w" |
Dosyayı yeniden yazmak için açar. | Doğrulamadan sonra | Açıldığı anda mevcut içerik temizlenir. |
json.dump |
Python nesnesini JSON olarak dosyaya yazar. | Kaydetme | Güncellenmiş nesnenin tamamı yazılır. |
indent=2 |
JSON çıktısını girintili biçimde düzenler. | Yazma biçimlendirmesi | Verinin içeriğini değil, görünümünü değiştirir. |
ensure_ascii=False |
Unicode karakterlerin okunabilir yazılmasına yardımcı olur. | JSON'u kaydederken | UTF-8 kodlamasıyla birlikte kullanılmalıdır. |
İç içe JSON ayar dosyası nasıl güncellenir?

İç içe bir JSON dosyasını güncellemek için önce dosyayı load ile Python veri yapısına aktarmalı, sözlük ve liste türlerini kontrol etmeli, değişikliği bellekte yapmalı ve sonucu dump ile yeniden kaydetmelisin. Ardından dosyayı tekrar okuyarak yazma işleminin doğru gerçekleştiğini kontrol edebilirsin.
Başlangıçta ayarlar.json dosyasının içeriği şöyle olsun:
{
"profil": {
"tema": "acik",
"dil": "tr"
},
"gorevler": [
{
"id": 1,
"baslik": "Değişkenleri öğren",
"tamamlandi": false
},
{
"id": 2,
"baslik": "Listelerle çalış",
"tamamlandi": false
}
]
}
Aşağıdaki kod, iç içe sözlük ve listeyi doğrular, id değeri 1 olan görevi bulur, profil temasını değiştirir ve dosyayı yeniden yazar:
import json
with open('ayarlar.json', 'r', encoding='utf-8') as dosya:
ayarlar = json.load(dosya)
if not isinstance(ayarlar, dict):
raise TypeError('Kök nesne sözlük olmalı.')
profil = ayarlar.get('profil')
gorevler = ayarlar.get('gorevler')
if not isinstance(profil, dict):
raise TypeError('profil alanı sözlük olmalı.')
if not isinstance(gorevler, list):
raise TypeError('gorevler alanı liste olmalı.')
if (not isinstance(profil.get('tema'), str)
or not isinstance(profil.get('dil'), str)):
raise TypeError('profil.tema ve profil.dil metin olmalı.')
hedef = None
for gorev in gorevler:
if not isinstance(gorev, dict):
raise TypeError('Her görev sözlük olmalı.')
if (type(gorev.get('id')) is not int
or not isinstance(gorev.get('baslik'), str)
or type(gorev.get('tamamlandi')) is not bool):
raise TypeError('Görev alanlarının türleri geçersiz.')
if gorev['id'] == 1:
hedef = gorev
if hedef is None:
raise KeyError('id değeri 1 olan görev bulunamadı.')
profil['tema'] = 'koyu'
hedef['tamamlandi'] = True
with open('ayarlar.json', 'w', encoding='utf-8') as dosya:
json.dump(ayarlar, dosya, indent=2, ensure_ascii=False)
with open('ayarlar.json', 'r', encoding='utf-8') as dosya:
sonuc = json.load(dosya)
print(json.dumps(sonuc, indent=2, ensure_ascii=False))
Yazma ve yeniden okuma sonrasında konsolda ya da dosyada beklenen sonuç şöyledir:
{
"profil": {
"tema": "koyu",
"dil": "tr"
},
"gorevler": [
{
"id": 1,
"baslik": "Değişkenleri öğren",
"tamamlandi": true
},
{
"id": 2,
"baslik": "Listelerle çalış",
"tamamlandi": false
}
]
}
Bu sonuçta yalnızca profil.tema ve id değeri 1 olan görevin tamamlandi alanı değişmiştir. dil alanı ile ikinci görev korunur. JSON içinde mantıksal değerler küçük harfle true ve false yazılır. Python kodunda ise bunların karşılığı büyük harfle True ve False değerleridir.
Eksik anahtarlar ve bozuk JSON nasıl ele alınır?
Eksik anahtar ile bozuk JSON farklı sorunlardır. profil, tema veya gorevler alanı yoksa dosya sözdizimi bakımından geçerli olabilir, fakat beklenen yapıyı taşımıyor demektir. Bu durumda in ile anahtarın bulunup bulunmadığını, dict.get() ile değerini ve isinstance() ile türünü kontrol etmelisin.
Örneğin kök nesnenin sözlük olup olmadığı, 'profil' in ayarlar ve 'gorevler' in ayarlar kontrolleriyle alanların bulunup bulunmadığı incelenebilir. profil.get('tema') metin değilse veya gorevler liste değilse anlaşılır bir TypeError ya da KeyError üretmek, eksik veriyi sessizce varsaymaktan daha güvenlidir.
JSON sözdizimi bozuksa hata json.load() sırasında oluşur. Bu durumda yalnızca ilgili hatayı yakalayabilirsin:
with open('ayarlar.json', 'r', encoding='utf-8') as dosya:
try:
ayarlar = json.load(dosya)
except json.JSONDecodeError as hata:
raise ValueError(
f'JSON sözdizimi bozuk: {hata.msg} '
f'(satır {hata.lineno}, sütun {hata.colno})'
) from hata
Satır ve sütun bilgisi, hatanın yakınındaki virgül, tırnak, süslü parantez veya köşeli parantez uyumsuzluğunu bulmayı kolaylaştırır. Her hatayı yakalayan except Exception yerine beklenen hata türünü yakalamak, sorunun kaynağını görünür tutar.
Yapı ve değer kontrolleri tamamlanmadan w kipine geçme. Yazma işlemi mevcut içeriğin üzerine yazabileceği için hatalı veriyi kaydetme veya özgün içeriği kaybetme riski oluşur. Yazma sonrasında dosyayı yeniden r ile açıp json.load() çağırmak, dosyanın tekrar ayrıştırılabildiğini gösterir; ancak görev kimliklerinin benzersizliği gibi bütün iş kurallarını tek başına doğrulamaz.
JSON güncelleme öncesi ve sonrası hangi kontrol listesi uygulanır?
- Oku: Dosyayı
rkipinde ve UTF-8 kodlamasıyla aç. Ardındanjson.loadkullanarak JSON içeriğini Python sözlüğü veya listesine aktar. - Doğrula: Verinin kök yapısını, iç içe alanların konumunu, kullanılacak anahtarları ve değer türlerini kontrol et. Örneğin bir alanın sözlük, liste, metin ya da sayı olması güncelleme biçimini etkiler.
- Değiştir: Yalnızca hedef alanları güncelle. Diğer anahtarları ve iç içe yapıların düzenini gereksiz yere değiştirmemek, dosyanın beklenen yapısını korumaya yardımcı olur.
- Yaz: Veriyi doğruladıktan sonra dosyayı
wkipinde aç vejson.dumpile kaydet. Okunabilir bir çıktı içinindentkullanabilir, Türkçe karakterlerin korunması gerekiyorsaensure_ascii=Falseekleyebilirsin. - Tekrar oku: Yazma işlemi tamamlandıktan sonra dosyayı yeniden
json.loadile oku. Güncellenen alanların beklenen değerleri taşıdığını ve diğer yapıların korun duğunu incele.
Python dosya işlemlerini daha geniş ve kişiye özel bir öğrenme planıyla sürdürmek istersen birebir Python dersleri kapsamında bu akışı farklı veri yapılarıyla çalışabilirsin.
Bu sıra, JSON güncellemesini kontrollü ve izlenebilir adımlara ayırır.