2013-08-27 2 views
9

Как проект, который поможет мне изучить Python, я делаю CMD-просмотрщик Reddit с использованием данных json (например, www.reddit.com/all/ .json). Когда появляются определенные сообщения, и я пытаюсь их распечатать (это то, что я предполагаю, вызывает ошибку), я получаю эту ошибку:Невозможно напечатать символ ' u2019' в Python от объекта JSON

Traceback (последний последний звонок): Файл «C: \ Users \ nsaba \ Desktop \ reddit_viewer.py ", строка 33, в print ("% d. (% d)% s \ n "% (i + 1, obj ['data'] ['score'], obj ['data'] [ 'название']))

Файл "C: \ Python33 \ Lib \ кодировок \ cp437.py", строка 19, в обратном кодирования codecs.charmap_encode (вход, self.errors, encoding_map) [0] UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\ u2019' в позиции 32: символьные карты на

Вот где я обрабатывать данные:

request = urllib.request.urlopen(url) 
content = request.read().decode('utf-8') 
jstuff = json.loads(content) 

Линия я использую, чтобы напечатать данные, как указано в сообщении об ошибке выше:

print ("%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title'])) 

Можно ли предположить, где я мог бы быть неправильно?

+0

Проблема почти наверняка не имеет ничего общего с JSON или с чем-либо еще в вашем коде. Попробуйте просто 'print ('\ u2019')' и посмотрите, получится ли у вас такая же ошибка. Если это так, проблема заключается в том, что ваш терминал («DOS box») не настроен для корректного вывода Юникода, и это то, что вам нужно исправить. – abarnert

+0

Да, вы правы. Причина дополнительных данных заключается в том, что я научился задавать вопросы, учитывая информацию, которую я имею, а не о том, что, на мой взгляд, может быть. –

+1

Но вы должны опубликовать минимальный полный пример, демонстрирующий вашу проблему. Вот что такое [SSCCE] (http://sscce.org). Если 'print ('\ u2019')' достаточно, чтобы продемонстрировать это, любой более сложный пример просто приведет людей к диким гусям. Если вы беспокоитесь, люди могут спросить: «Зачем вам печатать этот персонаж?», Тогда вы можете добавить контекст, который его объясняет ... но все же привести к реальной проблеме. – abarnert

ответ

18

Это почти уверен, что вы проблема не имеет ничего общего с кодом вы показали, и могут быть воспроизведены в одной строке:

print(u'\2019') 

Если набор символов вашего терминала не может справиться с U + 2019 (или если Python запутался в том, какой набор символов использует ваш терминал), нет возможности распечатать его. Неважно, приходит ли он из JSON или где-либо еще.

Терминал Windows (иначе «подсказка DOS» или «cmd window») обычно настраивается для набора символов, такого как cp1252, который знает только о 256 из 110000 символов, и ничего не может сделать с Python без значительного изменения к языковой реализации. *

См. PrintFails в вики Python для получения более подробной информации, обходных путей и ссылок на дополнительную информацию. На SO также есть несколько сотен дубликатов этой проблемы (хотя многие из них будут специфичны для Python 2.x, не упоминая об этом).


* Windows имеет целый отдельный набор API-интерфейсы для печати UTF-16 к терминалу, так Python может обнаружить, что стандартный вывод является терминалом для Windows, и если да, кодировать UTF-16 и использовать специальный API, вместо кодирования в кодировку терминала и использования стандартных. Но это вызывает множество различных проблем (например, различные способы печати до stdout выхода из синхронизации). Там были обсуждения о внесении этих изменений, но даже если бы все согласились, и патч был написан завтра, это все равно не помогло бы вам, пока вы не перейдете к какой-либо будущей версии Python, к которой он добавлен ...

+0

Извините за обман. Я рассмотрю ресурсы, которые вы предоставили. –

+3

@ N-Saba: Ну, сложно понять, что это дуп, потому что на самом деле не совсем понятно, что вам нужно искать, пока вы уже не знаете хотя бы половины ответа ... – abarnert

+0

@ N-Saba, я знаю, что это старый thread, но вы должны отметить это как ответ, если он ответил на ваш вопрос (он сделал мой) – ivan7707

0

Я установил IDLE (Python Shell) и шрифтом Window CMD по умолчанию для Lucida Console (поддерживаемый utf-8 шрифтом), и эти ошибки исчезли; и вы больше не видите коробки [] [] [] [] [] [] [] []

:)

0

@ N-Саба, что это строка, которая вызывает ошибку выбросить? В моем тестовом примере это выглядит как ошибка, связанная с версией в python 2.7.3.

В корме я разбор, поле «название» имело следующее значение:

u'title': u'Intel\u2019s Sharp-Eyed Social Scientist' 

я получаю ожидаемую правильный одинарную кавычку полукокса, когда я звоню либо из них, в питоне 2.7.6 ,

python -c "print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title']" 
Intel’s Sharp-Eyed Social Scientist 

В 2.7.3, я получаю сообщение об ошибке, если я не закодировать значение, которое я запряженных KEYNAME.

print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'] 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 5: ordinal not in range(128) 
print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'].encode('utf-8', 'replace') 
Intel’s Sharp-Eyed Social Scientist 

FWIW, команда @abamert печати ('\ u2019') печатает "9". Я думаю, что предполагаемый код был напечатан (u '\ u2019').

+0

'U' не требуется для Python 3, поскольку по умолчанию он используется для Unicode. – leewz

+0

Я получаю эту ошибку в 2.7.6 – user1167442

0

Я столкнулся с подобной ошибкой при попытке записать выход JSON API в файл .cav через pd.DataFrame.to_csv() при установке Win Python 2.7.14.

Указание кодировки в utf-8 фиксированной мой процесс:

pd.DataFrame.to_csv(filename, encoding='utf-8') 
0

Для тех, кто встречая это в MacOS, ответ @ abarnert является правильным, и я был в состоянии это исправить, поставив это в верхней части исходного обижая файла : -

# magic to make everything work in Unicode 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

Чтобы уточнить это, убедитесь, что вывод терминала правильно принят в Юникоде.

Смежные вопросы