Щоб отримати utf8 -encoded файл на відміну від ascii -encoded у прийнятій відповіді для 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'
аргумент 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 ціною трохи більшого розміру файлу.