Python'da Bir Dosyaya JSON Okuma ve Yazma

Giriş

Bu kılavuzda, JSON verilerini Python'da bir dosyadan ve bir dosyaya nasıl okuyup yazacağımıza bir göz atacağız. json modülü.

JSON (JavaScript Nesne Gösterimi) genel olarak uygulanabilir ve hafif olması ve aynı zamanda oldukça insan dostu olması nedeniyle, veri serileştirme için son derece popüler bir formattır. En önemlisi, web geliştirme dünyasında yaygın olarak kullanılmaktadır; burada büyük olasılıkla JSON tarafından serileştirilmiş nesnelerin gönderildiğiyle karşılaşacaksınız. REST API'leri, uygulama yapılandırması ve hatta basit veri depolama.

Yaygınlığı göz önüne alındığında, JSON dosyalarını (veya dizelerini) okumak ve ayrıştırmak oldukça yaygındır ve gönderilmek üzere JSON yazmak da aynı derecede yaygındır. Bu kılavuzda – bu özelliklerden nasıl yararlanabileceğinize bir göz atacağız json Python'da JSON okumak ve yazmak için modül.

json.dump() ve json.dumps() ile Python ile bir Dosyaya JSON Yazma

JSON içeriğini Python'daki bir dosyaya yazmak için şunu kullanabiliriz: json.dump() ve json.dumps(). Bunlar ayrı yöntemler ve farklı sonuç elde edin:

  • json.dumps() – Bir nesneyi JSON formatında serileştirir dizi
  • json.dump() – Dosyalara veya yuvalara kaydetmek için bir nesneyi JSON akışına seri hale getirdik

Not: “Dumps”taki “s” aslında kısaltmadır "dizeyi boşalt".

JSON'un doğal formatı şuna benzer: harita bilgisayar bilimlerinde – bir harita key-value çiftler. Python'da bir sözlükte bir harita uygulaması olduğundan doğal olarak JSON'u aslına sadık bir şekilde temsil edebileceğiz. dict. Bir sözlük, diğer iç içe geçmiş sözlükleri, dizileri, mantıksal değerleri veya tamsayılar ve dizeler gibi diğer ilkel türleri içerebilir.

:::

Not: Yerleşik json package, JSON ve sözlükler arasında dönüştürme yapmamızı sağlayan çeşitli kolaylık yöntemleri sunar.

:::

Olduğu söyleniyor, hadi içe aktaralım json modülü, bazı verilerle bir sözlük tanımlayın ve ardından bir dosyaya kaydetmeden önce onu JSON'a dönüştürün:

import json

data = {
    'employees' : [
        {
            'name' : 'John Doe',
            'department' : 'Marketing',
            'place' : 'Remote'
        },
        {
            'name' : 'Jane Doe',
            'department' : 'Software Engineering',
            'place' : 'Remote'
        },
        {
            'name' : 'Don Joe',
            'department' : 'Software Engineering',
            'place' : 'Office'
        }
    ]
}


json_string = json.dumps(data)
print(json_string)

Bunun sonucu:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Burada, birkaç tane içeren basit bir sözlüğümüz var. employees, her biri bir name, department ve place. dumps() işlevi json modül döker JSON içeriğine bir sözlük ve bir döndürür JSON dizesi.

Seri hale getirildikten sonra, seri durumdan çıkaracak veya örneğin saklayacak başka bir hizmete göndermeye karar verebilirsiniz. Bu JSON dizesini bir dosyaya depolamak için, bir dosyayı yazma modunda açıp onu yazmamız yeterlidir. Verileri daha sonra kullanmak üzere bağımsız bir değişkene çıkarmak istemiyorsanız ve yalnızca bir dosyaya dökmek istiyorsanız bu adımı atlayabilirsiniz. dumps() işlev ve kullanım dump() kurulum:


with open('json_data.json', 'w') as outfile:
    outfile.write(json_string)


with open('json_data.json', 'w') as outfile:
    json.dump(json_string, outfile)

Herhangi bir dosya benzeri nesne, ikinci bağımsız değişkene iletilebilir. dump() gerçek bir dosya olmasa bile işlev. Buna iyi bir örnek, bir dosyaya benzer şekilde açılıp kapatılabilen ve üzerine yazılabilen bir soket olabilir.

json.load() ve json.loads() ile Python ile bir Dosyadan JSON Okuma

Sözlük içerikleri ile JSON dizesi arasındaki eşleme basittir, dolayısıyla ikisi arasında dönüşüm yapmak kolaydır. İle aynı mantık dump() ve dumps() uygulandı load() ve loads(). Çok gibi json.dumps(), json.loads() işlevi bir JSON dizesini kabul eder ve onu bir sözlüğe dönüştürürken, json.load() bir dosyaya yüklemenizi sağlar:

import json

with open('json_data.json') as json_file:
    data = json.load(json_file)
    print(data)

Bunun sonucu:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Alternatif olarak, bir JSON dizesini sözlüğe okuyalım:

import json

python_dictionary = json.loads(json_string)
print(python_dictionary)

Bu da şu sonuçlarla sonuçlanır:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Bu, özellikle JSON gönderen REST API yanıtlarını ayrıştırmak için kullanışlıdır. Bu veriler size daha sonra iletebileceğiniz bir dizi olarak gelir. json.loads() doğrudan ve çalışmak için çok daha yönetilebilir bir sözlüğünüz var!

Sıralama, Güzel Yazdırma, Ayırıcılar ve Kodlama

Verilerinizi Python ile JSON'a serileştirirken, mesajları iletmek için gereken belleği en aza indirmeyi amaçlayan standart format, boşluklar ortadan kaldırıldığı için pek okunabilir değildir. Bu, veri aktarımı için ideal davranış olsa da (bilgisayarlar okunabilirliği önemsemez, ancak boyutu önemser) - bazen onu insanlar tarafından okunabilir hale getirmek için boşluk eklemek gibi küçük değişiklikler yapmanız gerekebilir.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

Not: json.dump()/json.dumps() ve json.load()/json.loads() hepsi birkaç biçimlendirme seçeneği sunar.

Python'da Pretty-Printing JSON

JSON'u insan tarafından okunabilir hale getirme (aka “güzel baskı”) için bir tamsayı değeri geçmek kadar kolaydır. indent parametre:

import json
data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
print(json.dumps(data, indent=4))

Bu, her yeni mantıksal blokta 4 boşlukluk bir girinti oluşturur:

{
    "people": [
        {
            "website": "stackabuse.com", 
            "from": "Nebraska", 
            "name": "Scott"
        }
    ]
}

Başka bir seçenek de komut satırı aracını kullanmaktır – json.tool. Bununla birlikte, iletilen dizeyi etkilemeden ve yalnızca standart çıkış kanalında nasıl görüntülendiğini etkilemeden JSON'u komut satırında güzel bir şekilde yazdırabilirsiniz:

$ echo '{"people":[{"name":"Scott", "website":"stackabuse.com", "from":"Nebraska"}]}' | python -m json.tool
{
    "people": [
        {
            "name": "Scott",
            "website": "stackabuse.com"
            "from": "Nebraska",
        }
    ]
}

JSON Nesnelerini Anahtarlara Göre Sıralama

JSON açısından:

“Bir nesne, sırasız bir ad/değer çiftleri kümesidir.”

Anahtar sırası garanti edilmez ancak anahtar sırasını zorunlu kılmanız gerekebilir. Sipariş vermek için geçebilirsiniz True için sort_keys kullanırken seçenek json.dump() or json.dumps():

import json
data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
print(json.dumps(data, sort_keys=True, indent=4))

Bunun sonucu:

{
    "people": [
        {
            "from": "Nebraska",
            "name": "Scott",
            "website": "stackabuse.com"
        }
    ]
}

ASCII Metin ve Kodlama

Varsayılan olarak, json.dump() ve json.dumps() verilen Python sözlüğündeki metnin ASCII kodlu olmasını sağlayacaktır. ASCII olmayan karakterler mevcutsa aşağıdaki örnekte gösterildiği gibi otomatik olarak çıkış yapılır:

import json
data = {'item': 'Beer', 'cost':'£4.00'}
jstr = json.dumps(data, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "u00a34.00"
}

Bu her zaman kabul edilebilir değildir ve çoğu durumda Unicode karakterlerinizi değiştirmeden tutmak isteyebilirsiniz. Bunu yapmak için, ensure_ascii için seçenek False:

jstr = json.dumps(data, ensure_ascii=False, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "£4.00"
}

Özel Anahtar Veri Türlerini Atla

Sözlüğünüzdeki bir anahtar ilkel olmayan bir türdeyse (str, int, float, bool or None) TypeError JSON içeriğini bir dosyaya dökmeyi denediğinizde ortaya çıkar. aracılığıyla bu tuşları atlayabilirsiniz. skipkeys argüman:

jstr = json.dumps(data, skipkeys=True)

Dairesel Kontrolü Etkinleştirme ve Devre Dışı Bırakma

Bir JSON nesnesinin bir özelliği kendisine başvuruyorsa veya ana nesneye geri başvuran başka bir nesne varsa, sonsuz özyinelemeli bir JSON oluşturulur. Sonsuz yineleme, tipik olarak, bir aygıtın belleği bitene kadar belleğin hızla tahsis edilmesiyle sonuçlanır ve JSON'un boşaltılması durumunda, RecursionError yükseltilir ve damping durdurulur.

Bu tarafından düzenlenir check_circular olan bayrak True varsayılan olarak ve döngüsel bağımlılıklar yazarken olası sorunları önler. Kapatmak için `Yanlış' olarak ayarlayabilirsiniz:

jstr = json.dumps(data, check_circular=False)

Ancak unutmayın ki bu büyük ölçüde tavsiye edilmez.

NaN'leri Etkinleştirme ve Devre Dışı Bırakma

NaN değerleri, örneğin -inf, inf ve nan seri hale getirmek veya serisini kaldırmak istediğiniz nesnelerin içine girebilir. JSON standardı izin vermiyor NaN değerleri için, ancak yine de bir mesajda iletmek isteyebileceğiniz mantıksal değeri taşırlar. Öte yandan, bu NaN değerlerini uygulamak isteyebilirsiniz değildir iletilir ve bunun yerine bir istisna oluşturur. bu allow_nan bayrak ayarlandı True varsayılan olarak ve NaN değerlerini JavaScript eşdeğerleriyle (Inifinity, -Infinity ve NaN).

bayrağı ayarlarsanız False bunun yerine tamamen JSON standardına uygun bir formata geçiş yapacaksınız; ValueError nesneleriniz şu değerlere sahip nitelikler içeriyorsa:

jstr = json.dumps(data, allow_nan=False)

Ayırıcıları Değiştirme

JSON'da, anahtarlar değerlerden iki nokta üst üste (:) ve maddeler birbirinden virgülle (,):

key1:value1,
key2:value2

Python'da JSON okumak ve yazmak için varsayılan ayırıcılar: (', ', ': ') ile boşlukların bulunması virgül ve iki noktadan sonra. Boşlukları atlamak ve böylece JSON'u biraz daha kompakt hale getirmek için bunları değiştirebilir veya farklı bir gösterim için ayırıcıları diğer özel karakterlerle tamamen değiştirebilirsiniz:


jstr = json.dumps(data, separators=(',', ':'))

Python 2 ile Uyumluluk Sorunları

Python'un (2.x) daha eski bir sürümünü kullanıyorsanız, bir sorunla karşılaşabilirsiniz. TypeError JSON içeriğini bir dosyaya dökmeye çalışırken. Yani, içerikler ASCII olmayan bir karakter içeriyorsa, bir TypeError yükseltilir, bile kullanırken kodlama bağımsız değişkenini iletirsiniz. json.dump() yöntem:


with open('json_data.json', 'w', encoding='utf-8') as outfile:
    json.dump(json_string, outfile, ensure_ascii=False)

Daha sonraki Python sürümlerinde düzeltilen bu uç durumla karşılaşırsanız, şunu kullanmayı deneyin: json.dumps() bunun yerine ve içeriği doğrudan bir dosyaya aktarmak yerine dize içeriğini bir dosyaya yazın.

Sonuç

Bu kılavuzda, sizi json.dump(), json.dumps(), json.load(), ve json.loads() JSON dizelerinin seri hale getirilmesine ve seri durumundan çıkarılmasına yardımcı olan yöntemler.

Daha sonra, JSON nesnelerini nasıl sıralayabileceğinize, bunları güzel bir şekilde yazdırabileceğinize, kodlamayı değiştirebileceğinize, özel anahtar veri türlerini atlayabileceğinize, döngüsel kontrolleri nasıl etkinleştirebileceğinize veya devre dışı bırakabileceğinize ve NaN'lere izin verilip verilmediğine ve ayrıca JSON nesneleri için ayırıcıları nasıl değiştirebileceğinize bir göz attık. serileştirme ve seri durumdan çıkarma.

JSON, yapılandırılmış verileri serileştirmenin en popüler yollarından biri olduğundan, özellikle web uygulamaları üzerinde çalışırken, muhtemelen onunla oldukça sık etkileşimde bulunmanız gerekecektir. Python'un json modülü başlamak için harika bir yoldur, ancak muhtemelen bunu bulacaksınız basit JSON sözdiziminde çok daha az katı olan başka bir harika alternatif.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı