Saya telah JSON data yang disimpan dalam variabel data
.
Aku ingin menulis ke file teks untuk pengujian jadi saya don't harus ambil data dari server setiap waktu.
Saat ini, saya mencoba ini:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
Dan saya menerima kesalahan:
TypeError: harus string atau buffer, tidak dict
Cara untuk memperbaiki kesalahan ini?
Anda lupa sebenarnya JSON bagian - data
adalah sebuah kamus dan belum JSON-encoded. Menulis itu seperti ini untuk kompatibilitas maksimum (Python 2 dan 3):
import json
with open('data.json', 'w') as f:
json.dump(data, f)
Pada sistem modern (yaitu, Python 3 dan mendukung UTF-8), anda dapat menulis lebih baik dengan file
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
Untuk mendapatkan utf8-dikodekan file sebagai lawan ascii-dikodekan dalam jawaban yang diterima untuk Python versi 2 menggunakan:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Kode sederhana di Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Pada Windows, encoding='utf-8'
argumen terbuka
masih diperlukan.
Untuk menghindari menyimpan dikodekan salinan data di memori (hasil dari pembuangan
) dan output utf8-dikodekan bytestrings di kedua Python 2 dan 3, menggunakan:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
The codec.getwriter
panggilan berlebihan di Python 3 tetapi diperlukan untuk Python 2
Mudah dibaca dan ukuran:
Penggunaan ensure_ascii=False
memberikan pembacaan yang lebih baik dan ukuran yang lebih kecil:
>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'
>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17
Lebih meningkatkan keterbacaan dengan menambahkan bendera indent=4, sort_keys=True
(seperti yang disarankan oleh dinos66) untuk argumen dari sampah
atau kesedihan
. Dengan cara ini anda'll mendapatkan menjorok baik diurutkan struktur dalam file json pada biaya yang sedikit lebih besar ukuran file.
Saya akan menjawab dengan sedikit modifikasi dengan jawaban tersebut dan itu adalah untuk menulis dipercantik file JSON yang mata manusia dapat membaca lebih baik. Untuk hal ini, lulus sort_keys
sebagai Benar
dan indent
dengan 4 karakter ruang dan anda baik untuk pergi. Juga berhati-hati untuk memastikan bahwa kode ascii tidak akan ditulis dalam file JSON:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)
# -*- coding: utf-8 -*-
import json
# Make it work for Python 2+3 and with Unicode
import io
try:
to_unicode = unicode
except NameError:
to_unicode = str
# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
'a string': 'bla',
'another dict': {'foo': 'bar',
'key': 'value',
'the answer': 42}}
# Write JSON file
with io.open('data.json', 'w', encoding='utf8') as outfile:
str_ = json.dumps(data,
indent=4, sort_keys=True,
separators=(',', ': '), ensure_ascii=False)
outfile.write(to_unicode(str_))
# Read JSON file
with open('data.json') as data_file:
data_loaded = json.load(data_file)
print(data == data_loaded)
Penjelasan parameter json.dump
:
indent
: Menggunakan 4 ruang untuk indent setiap entri, misalnya ketika baru dict dimulai (jika tidak semua akan berada dalam satu garis),sort_keys
: semacam kunci dari kamus. Hal ini berguna jika anda ingin membandingkan file json dengan diff alat / menempatkan mereka di bawah kontrol versi.pemisah
: Untuk mencegah Python menambahkan trailing spasi putihMelihat saya utilitas paket mpu
untuk super sederhana dan mudah untuk diingat satu:
import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)
{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}
.json
Untuk aplikasi anda, berikut ini mungkin penting:
Lihat juga: Perbandingan data serialisasi format
Dalam kasus anda bukan mencari cara untuk membuat file konfigurasi, anda mungkin ingin membaca artikel pendek Konfigurasi file di Python
Bagi anda yang mencoba untuk dump yunani atau lainnya "eksotik" bahasa seperti saya, tapi juga mengalami masalah (unicode kesalahan) dengan karakter aneh seperti simbol perdamaian (\u262E) atau orang lain yang sering terkandung dalam json format data seperti Twitter's, yang bisa menjadi solusi sebagai berikut (sort_keys jelas opsional):
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
Saya don't memiliki cukup reputasi untuk menambahkan di komentar, jadi saya hanya menulis beberapa temuan saya ini mengganggu TypeError berikut:
Pada dasarnya, saya pikir itu's bug di json.dump()
function di Python 2 hanya - dapat't dump Python (kamus / list) data yang berisi karakter non-ASCII, bahkan anda membuka file dengan encoding = 'utf-8'
parameter. (yaitu Tidak peduli apa yang anda lakukan). Tapi, json.kesedihan()
bekerja pada kedua Python 2 dan 3.
Untuk menggambarkan hal ini, menindaklanjuti phihag's jawaban: kode dalam jawabannya istirahat di Python 2 dengan pengecualian TypeError: harus unicode, tidak str
, jika data
berisi karakter non-ASCII. (Python 2.7.6, Debian):
import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)
Namun bekerja dengan baik dengan Python 3.
Menulis data ke dalam file menggunakan JSON menggunakan json.dump() atau json.kesedihan() yang digunakan. menulis seperti ini untuk menyimpan data dalam file.
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
ini contoh di daftar simpan ke file.
Untuk menulis JSON dengan lekukan, "cukup cetak":
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
Juga, jika anda perlu untuk men-debug benar berformat JSON, dan ingin membantu galat, penggunaan impor simplejson
perpustakaan, bukan import json
(fungsi harus sama)
Sebelumnya semua jawaban yang benar berikut ini adalah contoh yang sangat sederhana:
#! /usr/bin/env python
import json
def write_json():
# create a dictionary
student_data = {"students":[]}
#create a list
data_holder = student_data["students"]
# just a counter
counter = 0
#loop through if you have multiple items..
while counter < 3:
data_holder.append({'id':counter})
data_holder.append({'room':counter})
counter += 1
#write the file
file_path='/tmp/student_data.json'
with open(file_path, 'w') as outfile:
print("writing file to: ",file_path)
# HERE IS WHERE THE MAGIC HAPPENS
json.dump(student_data, outfile)
outfile.close()
print("done")
write_json()
Jawaban yang diterima adalah baik-baik saja. Namun, aku berlari ke "tidak json serializable" kesalahan menggunakan itu.
Berikut ini's bagaimana saya tetap
dengan terbuka("file name.json", 'w')
sebagai output:
output.write(str(respon))
Meskipun hal ini tidak memperbaiki baik sebagai file json menciptakan tidak akan memiliki tanda kutip ganda, namun hal ini bagus jika anda mencari untuk cepat dan kotor.
JSON data dapat ditulis ke file sebagai berikut
hist1 = [{'val_loss': [0.5139984398465246],
'val_acc': [0.8002029867684085],
'loss': [0.593220705309384],
'acc': [0.7687131817929321]},
{'val_loss': [0.46456472964199463],
'val_acc': [0.8173602046780344],
'loss': [0.4932038113037539],
'acc': [0.8063946213802453]}]
Menulis ke file:
with open('text1.json', 'w') as f:
json.dump(hist1, f)