首页 文章

可以在JSON对象的Python中使用't print character ' \ u2019

提问于
浏览
9

作为帮助我学习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 回答

  • 0

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

    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 不同步) . 有'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 ...
  • -1

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

    在我正在解析的feed中,“title”字段具有以下值:

    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” . 我认为目标代码是print(u'\ u2019') .

  • 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')
    
  • 0

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

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

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

  • 19

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

    :)

相关问题