无法在JSON对象中打印Python中的字符'\ u2019'

时间:2013-08-27 19:22:58

标签: python encoding printing python-3.x

作为帮助我学习Python的项目,我正在使用json数据制作Reddit的CMD查看器(例如www.reddit.com/all/.json)。当某些帖子出现并且我尝试打印它们时(我认为这会导致错误),我收到此错误:

追踪(最近一次通话):   文件“C:\ Users \ nsaba \ Desktop \ reddit_viewer.py”,第33行,in     print(“%d。(%d)%s \ n”%(i + 1,obj ['data'] ['得分'],obj ['数据'] ['标题']))

文件“C:\ Python33 \ lib \ encodings \ cp437.py”,第19行,编码     return codecs.charmap_encode(input,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']))

有人可以提出我可能出错的地方吗?

5 个答案:

答案 0 :(得分:19)

几乎可以肯定,您的问题与您展示的代码无关,可以在一行中复制:

print(u'\2019')

如果您的终端的字符集无法处理U + 2019(或者如果Python对您的终端使用的字符集感到困惑),则无法将其打印出来。无论是来自JSON还是其他任何地方都无关紧要。

Windows终端(又名“DOS提示符”或“cmd窗口”)通常配置为像cp1252这样的字符集,它只能识别110000个字符中的256个字符,而且没有任何重大更改,Python无法做到这一点。语言实现。*

有关详细信息,变通方法和更多信息的链接,请参阅Python Wiki上的PrintFails。在SO上还有几百个这样的问题(尽管其中许多都是Python 2.x特有的,没有提到它)。


* Windows有一组完整的API用于将UTF-16打印到终端,因此Python可以检测到stdout是Windows终端,如果是这样,则编码为UTF-16并使用特殊的API而不是编码到终端的字符集和使用标准的字符集。但是这引发了许多不同的问题(例如,打印到stdout的不同方式不同步)。有关进行这些更改的讨论,但即使每个人都同意并且补丁是明天编写的,在你升级到它添加到的任何未来版本的Python之前它仍然无法帮助你...

答案 1 :(得分:0)

@ N-Saba,导致错误抛出的字符串是什么? 在我的测试用例中,这看起来是python 2.7.3 中特定于版本的错误。

在我解析的Feed中,"标题"字段具有以下值:

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

当我在python 2.7.6 中调用其中任何一个时,我得到预期的正确的单引号char。

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')。

答案 2 :(得分:0)

在尝试在Win 2.7安装的Python 2.7.14上通过pd.DataFrame.to_csv()将API JSON输出写入.cav文件时,我遇到了类似的错误。

将编码指定为utf-8修复了我的进程:

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

答案 3 :(得分:0)

对于在macOS中遇到此问题的任何人来说,@ abarnert的回答是正确的,我可以通过将其放在有问题的源文件的顶部来修复它: -

|Machine name||Description||Project||Start date||Last date|
|Mach1|DB2_AIX|Team_1_PERS|TEST_1|07-03-2017|07-05-2017|
|Mach1|DB2_AIX|Team_1_PERS|TEST_2|13-05-2016|13-05-2017|
|Mach1|DB2_AIX|Team_1_PERS|TEST_1|22-05-2017|12-06-2017|

为了澄清,这是为了确保终端输出正确接受Unicode。

答案 4 :(得分:-1)

我将IDLE(Python Shell)和Window的CMD默认字体设置为Lucida Console(支持utf-8的字体),这些类型的错误消失了;你不再看到方框[] [] [] [] [] [] [] []

:)