Pour obtenir un fichier encodé en utf8 par opposition à encodé en ascii dans la réponse acceptée pour Python 2, utilisez:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Le code est plus simple en Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Sous Windows, l' encoding='utf-8'
argument to open
est toujours nécessaire.
Pour éviter de stocker une copie codée des données en mémoire (résultat de dumps
) et pour générer des sous - tests codés en utf8 en Python 2 et 3, utilisez:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
L' codecs.getwriter
appel est redondant en Python 3 mais requis pour Python 2
Lisibilité et taille:
L'utilisation de ensure_ascii=False
donne une meilleure lisibilité et une taille plus petite:
>>> 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
Améliorez encore la lisibilité en ajoutant des indicateurs indent=4, sort_keys=True
(comme suggéré par dinos66 ) aux arguments de dump
ou dumps
. De cette façon, vous obtiendrez une structure triée bien en retrait dans le fichier json au prix d'une taille de fichier légèrement plus grande.