Per ottenere il file codificato utf8 anziché codificato ASCII nella risposta accettata per Python 2, utilizzare:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Il codice è più semplice in Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Su Windows, l' encoding='utf-8'
argomento open
è ancora necessario.
Per evitare di archiviare una copia codificata dei dati in memoria (risultato di dumps
) e di generare i bytestring codificati in utf8 in Python 2 e 3, usare:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
La codecs.getwriter
chiamata è ridondante in Python 3 ma richiesta per Python 2
Leggibilità e dimensioni:
L'uso di ensure_ascii=False
offre una migliore leggibilità e dimensioni ridotte:
>>> 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
Migliorare ulteriormente la leggibilità aggiungendo flag indent=4, sort_keys=True
(come suggerito da dinos66 ) agli argomenti di dump
o dumps
. In questo modo otterrai una struttura ordinata ben rientrata nel file json al costo di una dimensione del file leggermente più grande.