печать и запись символов Unicode в Python

Я пытаюсь распечатать или записать некоторые символы Unicode в текстовый файл, и я сталкиваюсь с ошибками. Пожалуйста, посоветуйте, попытка Google дала мне несколько подсказок, но эта ошибка тоже. Ниже приведен мой код. Что я могу делать неправильно здесь ..

Я пытаюсь в конечном итоге использовать «запросы» и анализировать JSON с данными, которые имеют значения Unicode.

Я пытаюсь разобрать JSON, используя запросы с этого URL-адреса.

https://api.discogs.com/releases/7828220

try:
        import requests
import json
url = 'https://api.discogs.com/releases/7828220'
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' }
art = requests.get(url, headers=headers)
json_object = json.loads(art.text)
try:
    print str(json_object['companies'][0][name])
except:
    print "Genre list isn't defined"

    {u'name': u'\u041e\u041e\u041e "\u041f\u0430\u0440\u0430\u0434\u0438\u0437"', u'entity_type': u'10', u'catno': u'PARAD-432', u'resource_url': u'https://api.discogs.com/labels/210403', u'id': 210403, u'entity_type_name': u'Manufactured By'}

Здесь json_object['companies'][0][name] содержит несколько символов Unicode, которые не отображаются в терминале командной строки, а также не записываются в файл с требуемым выводом (Unicode)

Actual output looks like "ООО "Парадиз"", 

как я могу заставить python интерпретировать эти значения так, как они появляются?


person Prem Minister    schedule 04.12.2016    source источник
comment
в чем ошибка? в чем вопрос?   -  person Juggernaut    schedule 04.12.2016
comment
Кстати, bytes = u'' уже является строкой юникода   -  person Pierre Barre    schedule 04.12.2016
comment
Вы уверены, что шрифт вашего терминала поддерживает эти отсутствующие символы?   -  person Håken Lid    schedule 04.12.2016


Ответы (2)


не будет отображаться в терминале командной строки

Какие ошибки вы получаете? В любом случае, следующее работает, если вы удалите ненужное преобразование str() и кавычки 'name' на терминале, поддерживающем UTF-8, таком как Linux:

import requests
import json

url = 'https://api.discogs.com/releases/7828220'
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' }
art = requests.get(url, headers=headers)
json_object = json.loads(art.text)
print json_object['companies'][0]['name']

Выход:

ООО "Парадиз"

В Windows командная консоль может по умолчанию не использовать кодировку, которая поддерживает символы, которые вы пытаетесь напечатать. Один из простых способов — переключиться на поддерживаемую кодировку, в этом случае chcp 1251 меняет кодовую страницу на одну, поддерживающую русский язык, и все вышеперечисленное заработает.

чтобы записать его в файл, используйте io.open с кодировкой:

import io
with io.open('output.txt','w',encoding='utf8') as f:
    f.write(json_object['companies'][0]['name'])
person Mark Tolonen    schedule 04.12.2016
comment
Спасибо за подробное объяснение, я использую Windows 10, и терминал командной строки не поддерживает шрифты, но мне было интересно, почему он не пишет в файл с этими русскими символами, но с кодом, который вы показали, он работает! Спасибо! - person Prem Minister; 05.12.2016

Ваши «байты» уже имеют юникод, поэтому ошибки быть не должно.

>>> bytes = u'\xd0\x9e\xd0\x9e\xd0\x9e"\xd0\x9f\xd0\xb0\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xb7"'
>>> print unicode(bytes) 
ÐÐÐ "ÐаÑадиз"

Однако, если вы конвертируете строку / байтовую строку python2 (без префикса u"") в unicode, кодировка по умолчанию — ascii.

>>> bytes = '\xd0\x9e\xd0\x9e\xd0\x9e"\xd0\x9f\xd0\xb0\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xb7"'
>>> print unicode(bytes)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)

Правильная кодировка для использования здесь — UTF8. Вы можете указать unicode(), какую кодировку использовать.

>>> print unicode(bytes, 'utf8')
ООО "Парадиз"
person Håken Lid    schedule 04.12.2016
comment
Юникод обрабатывается гораздо более разумно в Python 3. Если вы новичок в Python, я настоятельно рекомендую использовать его вместо Python 2. - person Håken Lid; 04.12.2016
comment
Я бы порекомендовал это, даже если вы не новичок в python - person Pierre Barre; 04.12.2016