veri` değişkeninde depolanan JSON verilerim var.
Bunu test etmek için bir metin dosyasına yazmak istiyorum, böylece her seferinde sunucudan veri almak zorunda kalmayacağım.
Şu anda bunu deniyorum:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
Ve hata alıyorum:
TypeError: must be string or buffer, not dict
Bunu nasıl düzeltebilirim?
Gerçek JSON kısmını unuttunuz - data
bir sözlüktür ve henüz JSON olarak kodlanmamıştır. Maksimum uyumluluk için bu şekilde yazın (Python 2 ve 3):
import json
with open('data.json', 'w') as f:
json.dump(data, f)
Modern bir sistemde (yani Python 3 ve UTF-8 desteği), aşağıdakilerle daha güzel bir dosya yazabilirsiniz
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
Python 2 için kabul edilen cevaptaki ascii kodlu dosyanın aksine utf8 kodlu dosya elde etmek için kullanın:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Python 3'te kod daha basittir:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Windows'ta, open
için encoding='utf-8'
argümanı hala gereklidir.
Verinin kodlanmış bir kopyasını bellekte saklamaktan kaçınmak için (dumps
sonucu) ve hem Python 2 hem de 3'te utf8-encoded bytestrings çıktısı almak için kullanın:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
codecs.getwriter` çağrısı Python 3'te gereksizdir ancak Python 2 için gereklidir
Okunabilirlik ve boyut:
ensure_ascii=False` kullanımı daha iyi okunabilirlik ve daha küçük boyut sağlar:
>>> 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
dumpveya
dumpsargümanlarına
indent=4, sort_keys=True` (dinos66 tarafından önerildiği gibi) bayraklarını ekleyerek okunabilirliği daha da geliştirin. Bu şekilde, biraz daha büyük bir dosya boyutu pahasına json dosyasında güzel bir şekilde girintili sıralanmış bir yapı elde edersiniz.
Yukarıda belirtilen cevaplara küçük bir değişiklikle cevap verirdim ve bu da insan gözünün daha iyi okuyabileceği güzelleştirilmiş bir JSON dosyası yazmaktır. Bunun için sort_keys
değerini True
olarak ve indent
değerini 4 boşluk karakteri ile geçtiğinizde işiniz tamamdır. Ayrıca ascii kodların JSON dosyanıza yazılmamasına dikkat edin:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)