Apa perbedaan antara json.dump () dan json.dumps () dalam python?
131
Saya mencari di dokumen resmi ini untuk menemukan perbedaan antara json.dump () dan json.dumps () dalam python. Jelas bahwa mereka terkait dengan opsi penulisan file. Tetapi apa perbedaan terperinci antara mereka dan dalam situasi apa seseorang memiliki lebih banyak keunggulan daripada yang lain?
Tidak banyak yang bisa ditambahkan selain dari apa yang dikatakan dokumen. Jika Anda ingin membuang JSON ke file / socket atau apa pun, maka Anda harus menggunakannya dump(). Jika Anda hanya membutuhkannya sebagai string (untuk mencetak, parsing atau apa pun) maka gunakan dumps()(dump string)
Seperti yang disebutkan oleh Antii Haapala dalam jawaban ini , ada beberapa perbedaan kecil pada ensure_asciiperilaku. Hal ini sebagian besar disebabkan oleh bagaimana write()fungsi yang mendasarinya bekerja, karena ia beroperasi pada chunks daripada seluruh string. Periksa jawabannya untuk perincian lebih lanjut tentang itu.
json.dump()
Serialize obj sebagai stream yang diformat JSON ke fp (a .write () - mendukung objek seperti file
Jika sure_ascii False, beberapa chunks yang ditulis ke fp mungkin merupakan instance unicode
json.dumps()
Serialize obj ke str diformat JSON
Jika sure_ascii False, hasilnya mungkin berisi karakter non-ASCII dan nilai kembaliannya bisa berupa instance unicode
Bisakah Anda menunjukkan contoh cara menggunakan dump () untuk mengirim melalui soket? Saya tahu bahwa saya dapat menggunakan dumps () dan daripada encode () untuk mengkonversi ke byte, tetapi apakah ada cara yang lebih pendek?
Anak laki
37
Fungsi dengan sparameter take string. Yang lain mengambil aliran file.
Saat Anda memanggilnya jsonstr = json.dumps(mydata)pertama-tama buat salinan lengkap data Anda dalam memori dan hanya Anda yang file.write(jsonstr)memasukkannya ke disk. Jadi ini adalah metode yang lebih cepat tetapi bisa menjadi masalah jika Anda memiliki banyak data untuk disimpan.
Ketika Anda menelepon json.dump(mydata, file)- tanpa 's', memori baru tidak digunakan, karena data dibuang oleh potongan. Tetapi keseluruhan prosesnya sekitar 2 kali lebih lambat.
Sumber: Saya memeriksa kode sumber json.dump()dan json.dumps()dan juga menguji kedua varian yang mengukur waktu dengan time.time()dan menonton penggunaan memori di htop.
Satu perbedaan penting dalam Python 2 adalah bahwa jika Anda menggunakan ensure_ascii=False, dumpakan dengan benar menulis data yang dikodekan UTF-8 ke dalam file (kecuali jika Anda menggunakan string 8-bit dengan karakter diperluas yang bukan UTF-8):
dumpsdi sisi lain, dengan ensure_ascii=Falsedapat menghasilkan stratau unicodehanya tergantung pada jenis apa yang Anda gunakan untuk string:
Serialize obj ke str diformat JSON menggunakan tabel konversi ini. Jika sure_ascii False, hasilnya mungkin berisi karakter non-ASCII dan nilai kembaliannya bisa menjadi unicodecontoh .
(penekanan milikku). Perhatikan bahwa itu mungkin masih menjadi strcontoh juga.
Dengan demikian Anda tidak dapat menggunakan nilai baliknya untuk menyimpan struktur ke dalam file tanpa memeriksa format yang dikembalikan dan kemungkinan diputar unicode.encode.
Hal ini tentu saja bukan perhatian yang valid di Python 3 lagi, karena tidak ada lagi kebingungan 8-bit / Unicode ini.
Adapun loadvs loads, loadmenganggap seluruh file sebagai satu dokumen JSON, jadi Anda tidak dapat menggunakannya untuk membaca beberapa dokumen JSON terbatas baris baru dari satu file.
Semua teks yang dibuat dalam objek string python adalah unicode, tetapi apakah aman untuk menganggapnya secara umum? yaitu kapan memuat konten dari file?
João Gonçalves
@ JoãoGalçalves artinya Anda tidak dapat mencampur data biner dengan teks sehingga python menyetujuinya secara diam-diam. misalnya json.dumps([b'123'])-> TypeError.
Antti Haapala
@ JoãoGonçalves juga mencatat bahwa string dalam dokumen JSON harus Unicode , dan harus dalam UTF-8, UTF-16 atau UTF-32 menurut RFC 7159
Fungsi dengan
s
parameter take string. Yang lain mengambil aliran file.sumber
Dalam penggunaan memori dan kecepatan.
Saat Anda memanggilnya
jsonstr = json.dumps(mydata)
pertama-tama buat salinan lengkap data Anda dalam memori dan hanya Anda yangfile.write(jsonstr)
memasukkannya ke disk. Jadi ini adalah metode yang lebih cepat tetapi bisa menjadi masalah jika Anda memiliki banyak data untuk disimpan.Ketika Anda menelepon
json.dump(mydata, file)
- tanpa 's', memori baru tidak digunakan, karena data dibuang oleh potongan. Tetapi keseluruhan prosesnya sekitar 2 kali lebih lambat.Sumber: Saya memeriksa kode sumber
json.dump()
danjson.dumps()
dan juga menguji kedua varian yang mengukur waktu dengantime.time()
dan menonton penggunaan memori di htop.sumber
Satu perbedaan penting dalam Python 2 adalah bahwa jika Anda menggunakan
ensure_ascii=False
,dump
akan dengan benar menulis data yang dikodekan UTF-8 ke dalam file (kecuali jika Anda menggunakan string 8-bit dengan karakter diperluas yang bukan UTF-8):dumps
di sisi lain, denganensure_ascii=False
dapat menghasilkanstr
atauunicode
hanya tergantung pada jenis apa yang Anda gunakan untuk string:(penekanan milikku). Perhatikan bahwa itu mungkin masih menjadi
str
contoh juga.Dengan demikian Anda tidak dapat menggunakan nilai baliknya untuk menyimpan struktur ke dalam file tanpa memeriksa format yang dikembalikan dan kemungkinan diputar
unicode.encode
.Hal ini tentu saja bukan perhatian yang valid di Python 3 lagi, karena tidak ada lagi kebingungan 8-bit / Unicode ini.
Adapun
load
vsloads
,load
menganggap seluruh file sebagai satu dokumen JSON, jadi Anda tidak dapat menggunakannya untuk membaca beberapa dokumen JSON terbatas baris baru dari satu file.sumber
json.dumps([b'123'])
->TypeError
.