加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 解析推文中的新手错误json UnicodeEncodeError:’cha

发布时间:2020-12-20 12:30:13 所属栏目:Python 来源:网络整理
导读:我正在尝试按照数据科学课程的介绍.但是我试图解析来自twitter的json响应时遇到了问题 我试图从以下格式的json中检索文本. {u'delete': {u'status': {u'user_id_str': u'702327198',u'user_id': 702327198,u'id': 332772178690981889L,u'id_str': u'33277217
我正在尝试按照数据科学课程的介绍.但是我试图解析来自twitter的json响应时遇到了问题

我试图从以下格式的json中检索文本.

{u'delete': {u'status': {u'user_id_str': u'702327198',u'user_id': 702327198,u'id': 332772178690981889L,u'id_str': u'332772178690981889'}}},{u'delete': {u'status': {u'user_id_str': u'864736118',u'user_id': 864736118,u'id': 332770710667792384L,u'id_str': u'332770710667792384'}}},{u'contributors': None,u'truncated': False,**u'text'**: u'RT @afgansyah_reza: Lagi ngantri. Ada ibu2 & temennya. "Ih dia mukanya mirip banget sama Afgan.",trus ngedeketin gw,"Tuh kan.. Mirip bangu2026',u'in_reply_to_status_id': None,u'id': 332772350640668672L,u'favorite_count': 0,....... ]

这是我正在使用的代码:

def hw():
    data = []
    count=0
    with open('output.txt') as f:
        for line in f:
            encoded_string = line.strip().encode('utf-8')
            data.append(json.loads(encoded_string))

    print data# generates the input to next block
    for listval in data:#individual block
        if "text" in listval:
            print listval["text"]
        else:
            continue

但是,当我运行它时,我得到以下输出和错误

RT @afgansyah_reza: Lagi ngantri. Ada ibu2 & temennya. "Ih dia mukanya mirip banget sama Afgan.","Tuh kan.. Mirip bang…
RT @Dimaz_CSIX: Kolor pakek pita #laguharlemshake
Traceback (most recent call last):
  File "F:ProgrammingPointworkspace-newPyTesttweet_sentiment.py",line 41,in <module>
    main()
  File "F:ProgrammingPointworkspace-newPyTesttweet_sentiment.py",line 36,in main
    hw()
  File "F:ProgrammingPointworkspace-newPyTesttweet_sentiment.py",line 23,in hw
    print listval["text"]
  File "C:Python27libencodingscp1252.py",line 12,in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 13-63: character maps to <undefined>

我是Python的新来者,任何帮助将不胜感激.

解决方法

您的所有转换等都是正确的.问题只是试图将其打印到stdout.

(通常情况下,你会遇到重音,东亚等字符的问题;这里似乎是…省略号字符,但它也是同样的问题.)

如果您在终端窗口(DOS提示符等)中运行它,则只能打印终端字符集可以处理的字符.因此,例如,在为“cp1252”(与您的)配置的Windows框中,您无法打印非Latin-1 /非Latin-15 /非ANSI字符.

(在早期版本的Python中,有一个额外的问题,Python可能无法正确猜测终端的最佳编码,并坚持使用’ascii’,即使它可以处理utf-8,或者至少是cp1252.你可以找出Python使用sys.stdout.encoding猜测stdout的编码.如果这是错误的,你可以明确地修复它.)

但是如果你的终端不是UTF-8(并且它不是),你需要告诉它如何处理它无法代表的字符.您可以在打印时使用显式错误参数对字符串进行编码,如下所示:

print u.encode(sys.stdout.encoding,'replace')

……或其他各种各样的事情.但是,如果要在一个位置修复此问题,则需要更改打印的默认错误处理程序.

不幸的是,在Python 2.7中,虽然sys.stdout确实有一个errors属性,但它是只读的.解决这个问题的一种方法是用原始sys.stdout周围的包装器(或其底层文件句柄或其他等效的东西)替换它.例如:

>>> u = 'RT @afgansyah_reza: Lagi ngantri. Ada ibu2 &amp; temennya. "Ih dia mukanya mirip banget sama Afgan.","Tuh kan.. Mirip bangxe2x80xa6'.decode('utf8')
>>> print u
UnicodeEncodeError: 'charmap' codec can't encode characters in position 13-63: character maps to <undefined>
>>> sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout,errors='replace')
>>> print u
RT @afgansyah_reza: Lagi ngantri. Ada ibu2 &amp; temennya. "Ih dia mukanya mirip banget sama Afgan.","Tuh kan.. Mirip bang?

有关更多信息,请阅读2.x Unicode HOWTO和print上的文档.他们希望您知道unicode对象是一个字符串,因此它不会通过print转换,而是按原样传递给write.因此,诀窍是在sys.stdout.write中放置一些包装器,它将按原样编写str对象,但以不同方式编码unicode对象.编解码器或者io都可以为你做这件事,但是编解码器更向后兼容(并且io更向前兼容,但这并没有太大的区别,因为3.x处理Unicode的方式非常不同).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读