11

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

回溯(最近一次调用最后):文件“C:\Users\nsaba\Desktop\reddit_viewer.py”,第 33 行,打印中(“%d. (%d) %s\n” % (i+1, obj ['data']['score'], obj['data']['title']))

文件“C:\Python33\lib\encodings\cp437.py”,第 19 行,编码返回 codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\ 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']))

任何人都可以建议我可能会出错的地方吗?

4

5 回答 5

20

几乎可以肯定您的问题与您显示的代码无关,并且可以在一行中重现:

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……</p>

于 2013-08-27T19:40:03.420 回答
0

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

在我正在解析的提要中,“标题”字段具有以下值:

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

当我在 python 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 命令 print('\u2019') 打印“9”。我认为预期的代码是 print(u'\u2019')。

于 2014-03-16T13:55:52.160 回答
0

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

将编码指定为utf-8固定我的过程:

pd.DataFrame.to_csv(filename, encoding='utf-8')
于 2018-01-15T11:43:47.090 回答
0

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

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

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

于 2018-01-17T12:01:05.340 回答
-1

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

:)

于 2013-08-27T22:59:40.597 回答