作为帮助我学习Python的项目,我正在使用json数据制作Reddit的CMD查看器(例如www.reddit.com/all/.json) . 当某些帖子出现并且我尝试打印它们时(我认为是导致错误),我收到此错误:
回溯(最近一次调用最后一次):文件“C:\ Users \ nsaba \ Desktop \ reddit_viewer.py”,第33行,打印(“%d . (%d)%s \ n”%(i 1,obj [ 'data'] ['得分'],obj ['数据'] [' Headers ']))
文件“C:\ Python33 \ lib \ encodings \ 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']))
任何人都可以建议我可能出错的地方?
5 回答
几乎可以肯定,您的问题与您显示的代码无关,可以在一行中复制:
如果您的终端的字符集无法处理U 2019(或者如果Python对您的终端使用的字符集感到困惑),则无法将其打印出来 . 它是来自JSON还是其他任何地方并不重要 .
Windows终端(又名“DOS提示符”或“cmd窗口”)通常配置为像cp1252这样的字符集,它只知道110000个字符中的256个字符,并且没有Python可以对此做什么,而不会对语言实现进行重大更改* .
有关详细信息,变通方法和更多信息的链接,请参阅Python Wiki上的PrintFails . 在SO上还有几百个这个问题的重复(虽然其中许多将特定于Python 2.x,但没有提到它) .
stdout
不同步) . 有's been discussion about making these changes, but even if everyone were to agree and the patch were written tomorrow, it still wouldn' t帮助你,直到你升级到它添加到的任何未来版本的Python ...@ N-Saba,导致错误抛出的字符串是什么?在我的测试用例中,这看起来是python 2.7.3 中特定于版本的错误 .
在我正在解析的feed中,“title”字段具有以下值:
当我在python 2.7.6 中调用其中任何一个时,我得到了预期的右单引号char .
在 2.7.3 中,我得到错误,除非我编码由KeyName拉取的值 .
fwiw,@ abamert命令打印('\ u2019')打印“9” . 我认为目标代码是print(u'\ u2019') .
尝试在Win 2.7安装的Python 2.7.14上通过
pd.DataFrame.to_csv()
将API JSON输出写入.cav文件时,我遇到了类似的错误 .将编码指定为
utf-8
修复了我的进程:对于在macOS中遇到此问题的任何人来说,@ abarnert的回答是正确的,我可以通过将其放在有问题的源文件的顶部来修复它: -
为了澄清,这是确保终端输出正确接受Unicode .
我将IDLE(Python Shell)和Window的CMD默认字体设置为Lucida Console(支持utf-8的字体),这些类型的错误消失了;你不再看到方框[] [] [] [] [] [] [] []
:)