Saya memiliki data JSON yang disimpan dalam variabel data
.
Saya ingin menulis ini ke file teks untuk pengujian jadi saya tidak harus mengambil data dari server setiap kali.
Saat ini, saya mencoba ini:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
Dan saya menerima kesalahan ini:
TypeError: harus berupa string atau buffer, bukan dict
Bagaimana cara memperbaikinya?
json.dump
menulis ke file atau objek seperti file, sedangkanjson.dumps
mengembalikan string.json.dump
menulis ke file teks, bukan file biner. Anda akan mendapatkanTypeError
jika file dibuka bersamawb
. Pada versi Python yang lebih lama, keduanyaw
nandwb
berfungsi. Pengkodean eksplisit tidak diperlukan karena outputjson.dump
ASCII-only secara default. Jika Anda dapat memastikan bahwa kode Anda tidak pernah berjalan pada versi Python lama dan Anda dan pawang file JSON dapat dengan benar menangani data non-ASCII, Anda dapat menentukan satu dan mengaturensure_ascii=False
.Untuk mendapatkan file ber- utf8 sebagai ganti ascii- di- enode dalam jawaban yang diterima untuk Python 2 gunakan:
Kode ini lebih sederhana dalam Python 3:
Di Windows,
encoding='utf-8'
argumen untukopen
masih diperlukan.Untuk menghindari penyimpanan salinan data yang dikodekan dalam memori (hasil
dumps
) dan untuk output bytest yang dikodekan utf8 di Python 2 dan 3, gunakan:The
codecs.getwriter
panggilan berlebihan di Python 3 tetapi diperlukan untuk Python 2Keterbacaan dan ukuran:
Penggunaan
ensure_ascii=False
memberi keterbacaan yang lebih baik dan ukuran yang lebih kecil:Lebih lanjut meningkatkan keterbacaan dengan menambahkan flag
indent=4, sort_keys=True
(seperti yang disarankan oleh dinos66 ) ke argumendump
ataudumps
. Dengan cara ini Anda akan mendapatkan struktur diurutkan dengan indentasi baik dalam file json dengan biaya ukuran file yang sedikit lebih besar.sumber
unicode
berlebihan - hasil darijson.dumps
sudah merupakan objek unicode. Perhatikan bahwa ini gagal dalam 3.x, di mana seluruh kekacauan mode file output ini telah dibersihkan, dan json selalu menggunakan string karakter (dan karakter I / O) dan tidak pernah byte.type(json.dumps('a'))
adalah<type 'str'>
. Bahkantype(json.dumps('a', encoding='utf8'))
adalah<type 'str'>
.utf8
bahkan dalam 3.x. Diperbarui jawabannya.'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128)
. Jadi ketika ragu, gunakan jawaban 3.x!Saya akan menjawab dengan sedikit modifikasi dengan jawaban yang disebutkan di atas dan itu adalah untuk menulis file JSON cantik yang mata manusia dapat membaca lebih baik. Untuk ini, sampaikan
sort_keys
sebagaiTrue
danindent
dengan 4 karakter spasi dan Anda siap melakukannya. Juga pastikan untuk memastikan bahwa kode ascii tidak akan ditulis dalam file JSON Anda:sumber
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
# -*- coding: utf-8 -*-
setelah shebangUnicodeEncodeError
dengan data non-ascii). Lihat solusi saya untuk detailnya.Baca dan tulis file JSON dengan Python 2 + 3; bekerja dengan unicode
Penjelasan parameter
json.dump
:indent
: Gunakan 4 spasi untuk membuat indentasi setiap entri, misalnya saat dikt baru dimulai (jika tidak semua akan berada dalam satu baris),sort_keys
: urutkan kunci kamus. Ini berguna jika Anda ingin membandingkan file json dengan alat diff / meletakkannya di bawah kontrol versi.separators
: Untuk mencegah Python menambahkan spasi spasi tambahanDengan satu paket
Lihatlah paket utilitas saya
mpu
untuk paket yang super sederhana dan mudah diingat:File JSON dibuat
Ujung file umum
.json
Alternatif
Untuk aplikasi Anda, berikut ini mungkin penting:
Lihat juga: Perbandingan format serialisasi data
Jika Anda mencari cara untuk membuat file konfigurasi, Anda mungkin ingin membaca artikel pendek saya File konfigurasi dalam Python
sumber
force_ascii
flag secaraTrue
default. Anda akan memiliki"\u20ac"
urutan 6-byte yang tidak dapat dibaca untuk masing-masing€
dalam file json Anda (dan juga karakter non-ascii lainnya).open
untuk membaca tetapiio.open
untuk menulis? Apakah mungkin digunakanio.open
untuk membaca juga? Jika demikian, parameter apa yang harus dilewati?Bagi Anda yang mencoba untuk membuang bahasa Yunani atau bahasa "eksotis" lainnya seperti saya tetapi juga mengalami masalah (kesalahan unicode) dengan karakter aneh seperti simbol perdamaian (\ u262E) atau lainnya yang sering terkandung dalam data yang diformat json seperti Twitter, solusinya bisa seperti berikut (sort_keys jelas opsional):
sumber
open
dan assotiatedio.open
lebihcodecs.open
, dalam hal ini juga merupakan hack bagus mundur-kompatibel. Dalam python2codecs.open
lebih "omnivora" daripada io.open (ini bisa "memakan" str dan unicode, mengonversi jika perlu). Orang dapat mengatakan bahwacodecs.open
kekhasan ini mengkompensasijson.dumps
kekhasan menghasilkan berbagai jenis objek (str
/unicode
) tergantung pada keberadaan string unicode dalam input.Saya tidak memiliki reputasi yang cukup untuk menambahkan komentar, jadi saya hanya menulis beberapa temuan saya tentang TypeError yang mengganggu ini di sini:
Pada dasarnya, saya pikir itu bug dalam
json.dump()
fungsi hanya di Python 2 - Tidak bisa membuang data Python (kamus / daftar) yang mengandung karakter non-ASCII, bahkan Anda membuka file denganencoding = 'utf-8'
parameter. (Yaitu apa pun yang Anda lakukan). Tapi,json.dumps()
bekerja pada Python 2 dan 3.Untuk mengilustrasikan ini, menindaklanjuti jawaban phihag: kode dalam jawabannya istirahat dalam Python 2 dengan pengecualian
TypeError: must be unicode, not str
, jikadata
berisi karakter non-ASCII. (Python 2.7.6, Debian):Namun itu berfungsi dengan baik di Python 3.
sumber
data = {'asdf': 1}
. Anda akan mendapatkan yang terkenalTypeError
dengan varian (kedua) Anda.ensure_ascii
- perlu jika Anda ingin mendapatkan output utf8 "nyata". Tanpanya Anda akan memiliki ascii polos dengan 6 byte per huruf rusia dibandingkan dengan 2 byte per karakter dengan bendera ini.unicode()
bagian itu. Saya baru sadar untukio
paket di Python 2,write()
perluunicode
, tidakstr
.Tulis data dalam file menggunakan JSON menggunakan json.dump () atau json.dumps () yang digunakan. tulis seperti ini untuk menyimpan data dalam file.
contoh ini dalam daftar adalah menyimpan ke file.
sumber
Untuk menulis JSON dengan lekukan, "cetak cantik":
Juga, jika Anda perlu men-debug JSON yang diformat dengan tidak benar, dan ingin pesan kesalahan yang bermanfaat, gunakan
import simplejson
pustaka, alih-alihimport json
(fungsinya harus sama)sumber
sumber
f = open('1.txt', 'w'); f.write('a'); input()
. Jalankan dan kemudian SYGTERM (Ctrl-Z
lalukill %1
di linux,Ctrl-Break
di Windows).1.txt
akan memiliki 0 byte. Itu karena tulisannya buffered dan file tidak memerah tidak ditutup pada saat SYGTERM terjadi.with
blokir menjamin bahwa file selalu ditutup seperti halnya blok 'coba / akhirnya' tetapi lebih pendek.Menulis JSON ke File
Membaca JSON dari File
sumber
jika Anda mencoba untuk menulis bingkai data panda menjadi file menggunakan format json saya akan merekomendasikan ini
sumber
Semua jawaban sebelumnya benar di sini adalah contoh yang sangat sederhana:
sumber
Jawaban yang diterima baik-baik saja. Namun, saya mengalami kesalahan "tidak json serializable" menggunakan itu.
Inilah cara saya memperbaikinya dengan
open("file-name.json", 'w')
sebagai output:output.write(str(response))
Meskipun ini bukan perbaikan yang baik karena file json yang dibuatnya tidak akan memiliki tanda kutip ganda, namun sangat bagus jika Anda mencari yang cepat dan kotor.
sumber
Data JSON dapat ditulis ke file sebagai berikut
Menulis ke file:
sumber