Чтобы получить файл с кодировкой utf8, а не кодированный ascii в принятом ответе для Python 2, используйте:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Код проще в Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
В Windows encoding='utf-8'
аргумент to open
по-прежнему необходим.
Чтобы не хранить зашифрованную копию данных в памяти (результат dumps
) и выводить строки кодирования utf8 в Python 2 и 3, используйте:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
codecs.getwriter
Вызов является излишним в Python 3 , но требуется для Python 2
Читаемость и размер:
Использование ensure_ascii=False
дает лучшую читаемость и меньший размер:
>>> 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
Дальнейшее улучшение читабельности путем добавления флагов indent=4, sort_keys=True
(как предложено dinos66 ) к аргументам dump
или dumps
. Таким образом, вы получите аккуратно отсортированную структуру с отступом в файле json за счет немного большего размера файла.