Дамп JSON разбивает мой словарь при использовании определенных символов

Сброс данных в файл с помощью json.свалка.
Данные выглядят следующим образом:

{"hello": {"this": 1, "a": 1, "is": 1, "test": 1}}

Код, который я использую для достижения этого, выглядит следующим образом (worddict-это файл, что-то вроде файла.формат JSON):

with open(words, 'w') as fp:
    json.dump(worddict, fp)
fp.close()

Я хотел бы иметь данные в этом формате:

{
"hello": {
    "a": 1,
    "is": 1,
    "test": 1,
    "this": 1
}

Я изменил код на этот:

with open(words, 'w') as fp:
    json.dump(worddict, fp, sort_keys=True, indent=4, separators=(',', ': '))
fp.close()

И это работает, пока я не пытаюсь сбросить символы «Á», «É», «Ű»…
Эти символы разрывает файл worddict, и когда я кошку файл выглядит так:

{

Есть идеи почему?

2 ответа

  1. Заменять

        json.dump(worddict, fp, sort_keys=True, indent=4, separators=(',', ': '))
    

    с

        json.dump(worddict, fp, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False)
    
  2. Я запустил фрагмент кода в python2 и python3.
    В python3 это не дало мне ошибок.

    Я выполнил следующий код:

    import json
    
    words = 'a.txt'
    worddict = {"hello": {"this": 1, "a": 1, "is": 1, "test": "Á"}}
    with open(words, 'w') as fp:
        json.dump(worddict, fp, sort_keys=True, indent=4, separators=(',', ': '))
    

    и получил как выход:

    {
        "hello": {
            "a": 1,
            "is": 1,
            "test": "\u00c1",
            "this": 1
        }
    }
    

    Но в python2 я столкнулся с ошибками. Я получил ссылку с описанием ошибки:
    http://www.python.org/peps/pep-0263.html

    Проблема возникает в python2 как строки python2 как не unicode по умолчанию. Поэтому вы должны упомянуть кодировку в верхней части файла исходного кода.
    Я добавил «# coding=UTF-8 » в верхнюю часть файла, прежде чем начнется исходный код python, чтобы дать интерпретатору python знать кодировку файла. Как только я это сделал, код запустился в python2, а также python3 без ошибок.
    Я получил следующее как выход:

    {
        "hello": {
            "a": 1,
            "is": 1,
            "test": "\u00c1",
            "this": 1
        }
    }
    

    Вот мой полный окончательный исходный код, который я использовал.

    # coding=UTF-8
    
    import json
    
    words = 'a.txt'
    worddict = {"hello": {"this": 1, "a": 1, "is": 1, "test": "Á"}}
    with open(words, 'w') as fp:
        json.dump(worddict, fp, sort_keys=True, indent=4, separators=(',', ': '))