Aby uzyskać plik zakodowany w utf8 w przeciwieństwie do kodu zakodowanego w ascii w zaakceptowanej odpowiedzi dla Python 2, użyj:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Kod jest prostszy w Pythonie 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
W systemie Windows encoding='utf-8'
argument to open
jest nadal konieczny.
Aby uniknąć zapisania zakodowanej kopii danych w pamięci (wynik dumps
) i wygenerować bajtowanie zakodowane w utf8 zarówno w Pythonie 2, jak i 3, użyj:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
codecs.getwriter
Rozmowa jest zbędna w Pythonie 3, ale konieczne dla Pythona 2
Czytelność i rozmiar:
Zastosowanie ensure_ascii=False
daje lepszą czytelność i mniejszy rozmiar:
>>> 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
Dalsza poprawa czytelności poprzez dodanie flag indent=4, sort_keys=True
(jak sugeruje dinos66 ) do argumentów dump
lub dumps
. W ten sposób uzyskasz ładnie wciętą posortowaną strukturę w pliku json, kosztem nieco większego rozmiaru pliku.