Как правильно печатать расширенные символы ASCII с помощью json.dumps() - Python

У меня есть этот файл JSON с некоторыми символами, принадлежащими Extended ASCII characters, например », •, ñ, Ó, Ä

{
    "@index": "1",
    "row": [
    {
        "col": [
        {
            "text": {
            "@x": "1",
            "#text": "Text » 1 A\\CÓ"
            }
        }
        ]
    },
    {
        "col": [
        {
            "text": {
            "@x": "7",
            "#text": "Text • 2 Wñ"
            }
        }
        ]
    }
    ]
}

Я загружаю его в переменную d с помощью json.load(), как показано ниже.

import json 

with open('in.json') as f:
    d = json.load(f)

и d выглядит так:

d = {'@index': '1', 'row': [{'col': [{'text': {'@x': '1', '#text': 'Text » 1 A\\CÓ'}}]}, {'col': [{'text': {'@x': '7', '#text': 'Text • 2 Wñ'}}]}]}

Затем, применяя следующий код, json, хранящийся в d, преобразуется в вложенный json одного уровня (до сих пор расширенные символы ASCII в порядке)

>>> z = {**d, 'row':[c['text'] for b in d['row'] for c in b['col']]}
>>> z
{'@index': '1', 'row': [{'@x': '1', '#text': 'Text » 1 A\\CÓ'}, {'@x': '7', '#text': 'Text • 2 Wñ'}]}
>>>

Проблема возникает, когда я использую json.dumps(), потому что расширенные символы ASCII печатаются неправильно, как вы можете видеть ниже.

Как это исправить? Спасибо за любую помощь.

>>> print(json.dumps(z, indent=4))
{
    "@index": "1",
    "row": [
        {
            "@x": "1",
            "#text": "Text \u00bb 1 A\\C\u00d3"
        },
        {
            "@x": "7",
            "#text": "Text \u2022 2 W\u00f1"
        }
    ]
}
>>>

Символы не печатаются "неправильно"; \uXXXX экранирование — вполне допустимый альтернативный способ представления символов.

jwodder 30.05.2019 00:04

Но мне нужно, чтобы они были удобочитаемыми для человека. Я надеюсь, что смысл.

Ger Cas 30.05.2019 00:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
969
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы ищете параметр ensure_ascii.

import json                   

raw_data = '{"data": ["»", "•", "ñ", "Ó", "Ä"]}'
json_data = json.loads(raw_data)

print(json_data)
# {u'data': [u'\xbb', u'\u2022', u'\xf1', u'\xd3', u'\xc4']}

processed_data = json.dumps(json_data, indent=4, ensure_ascii=False, encoding='utf-8')

print(processed_data)
# {
#     "data": [
#         "»", 
#         "•", 
#         "ñ", 
#         "Ó", 
#         "Ä"
#     ]
# }

Для Python2 вы должны сделать:

processed_data = json.dumps(json_data, indent=4, ensure_ascii=False).encode('utf-8')

Большое спасибо за Вашу помощь. Ваш пример кода работает для меня в python2, а эта строка json.dumps(json_data, ...ensure_ascii=False).encode('utf-8') работает для меня в Python3. Но когда я тестирую в Python3, print(processed_data) выглядит так b'{\n "data": [\n "\xc2\xbb",\n .., а не как красивая печать в вашем примере.

Ger Cas 30.05.2019 00:34

Другие вопросы по теме