Python'da json.dump () ve json.dumps () arasındaki fark nedir?


131

Python'daki json.dump () ve json.dumps () arasındaki farkı bulmak için bu resmi belgede arama yaptım. Dosya yazma seçeneği ile ilgili oldukları açıktır.
Fakat aralarındaki ayrıntılı fark nedir ve hangi durumlarda birinin diğerinden daha fazla avantajı vardır?

Yanıtlar:


146

Dokümanların söylediklerinden başka eklenecek pek bir şey yok. JSON'u bir dosyaya / sokete veya herhangi bir şeye dökmek istiyorsanız, o zaman devam etmelisiniz dump(). Yalnızca bir dize olarak ihtiyacınız varsa (yazdırma, ayrıştırma veya her neyse) o zaman dumps()(dump string) kullanın

Antii Haapala'nın bu cevapta bahsettiği gibi , ensure_asciidavranışta bazı küçük farklılıklar vardır . Bu çoğunlukla temel write()işlevin nasıl çalıştığına bağlıdır, çünkü tüm dizeden ziyade parçalar üzerinde çalışır. Bununla ilgili daha fazla ayrıntı için cevabını kontrol edin.

json.dump()

Objeyi JSON formatlı bir akış olarak fp'ye seri hale getirin (a .write () - dosya benzeri nesneyi destekler

Sure_ascii False ise, fp'ye yazılan bazı parçalar unicode örnekleri olabilir

json.dumps()

Objeyi JSON formatlı bir str'ye seri hale getirin

Sure_ascii False ise, sonuç ASCII olmayan karakterler içerebilir ve dönüş değeri bir unicode örneği olabilir


Soket yoluyla göndermek için dump () 'ın nasıl kullanılacağına dair bir örnek gösterebilir misiniz? Bayta dönüştürmek için dumps () ve encode () kullanabileceğimi biliyorum, ancak daha kısa bir yol var mı?
Erkek


20

Bellek kullanımı ve hızda.

Onu aradığınızda jsonstr = json.dumps(mydata)önce hafızada verilerinizin tam bir kopyasını oluşturur ve sonra siz file.write(jsonstr)onu diske atarsınız. Dolayısıyla bu daha hızlı bir yöntemdir ancak kaydedilecek büyük miktarda veriniz varsa sorun olabilir.

json.dump(mydata, file)'S' olmadan aradığınızda , veriler yığınlar halinde döküldüğü için yeni bellek kullanılmaz. Ancak tüm süreç yaklaşık 2 kat daha yavaştır.

Kaynak: Ben kaynak kodunu kontrol json.dump()ve json.dumps()hem de hem vakit ölçme varyantları test time.time()ve htop bellek kullanımını izlemek.


6

Python 2'deki dikkate değer bir fark, kullanıyorsanız ensure_ascii=False, dumpUTF-8 kodlu verileri dosyaya düzgün bir şekilde yazacak olmasıdır (UTF-8 olmayan genişletilmiş karakterlere sahip 8 bitlik dizeler kullanmadıysanız):

dumpsÖte yandan, ile dizeler için kullandığınız türlere bağlı olarak ensure_ascii=Falsea strveya unicodesadece üretebilir :

Bu dönüştürme tablosunu kullanarak objeyi JSON formatlı bir str'ye seri hale getirin. Sure_ascii False ise, sonuç ASCII olmayan karakterler içerebilir ve dönüş değeri bir unicodeörnek olabilir .

(vurgu benim). Yine de bir strörnek olabileceğini unutmayın .

Bu nedenle, hangi formatın döndürüldüğünü kontrol etmeden ve muhtemelen oynamadan yapıyı dosyaya kaydetmek için dönüş değerini kullanamazsınız unicode.encode.

Bu 8-bit / Unicode karmaşası olmadığından, bu elbette Python 3 için artık geçerli bir endişe değil.


Gelince loadvs loads, loadgördüğü bütün tek dosyadan birden satır sınırlı JSON belgeleri okumak için kullanamaz, böylece bir JSON belge olması için dosyayı.


Bir python dizesi nesnesinde oluşturulan tüm metinler unicode'dur, ancak bunu genel olarak varsaymak güvenli midir? Yani bir dosyadan içerik yüklerken?
João Gonçalves

@ JoãoGon normal, ikili verileri metinle karıştıramayacağınız anlamına gelir, böylece python sessizce onaylar. örneğin json.dumps([b'123'])-> TypeError.
Antti Haapala

@ JoãoGonçalves da JSON belgelerde dizeleri o notu yapmak Unicode olmalı ve olmalı , UTF-16 veya UTF-32 RFC 7159 göre UTF-8 hiçbirinde
Antti Haapala

1
Bu açıklama için teşekkürler! Mantıklı
João Gonçalves
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.