解析推文中的新手错误json UnicodeEncodeError:'charmap'编解码器无法编码位置13-63中的字符:字符映射到<undefined>

see*_*ker 3 python list

我正在尝试按照数据科学课程的介绍.但是我试图解析来自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 &amp; temennya. "Ih dia mukanya mirip banget sama Afgan.", trus ngedeketin gw, "Tuh kan.. Mirip bang\u2026', u'in_reply_to_status_id': None, u'id': 332772350640668672L, u'favorite_count': 0, ....... ]
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

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
Run Code Online (Sandbox Code Playgroud)

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

   RT @afgansyah_reza: Lagi ngantri. Ada ibu2 &amp; temennya. "Ih dia mukanya mirip banget sama Afgan.", trus ngedeketin gw, "Tuh kan.. Mirip bang…
RT @Dimaz_CSIX: Kolor pakek pita #laguharlemshake
Traceback (most recent call last):
  File "F:\ProgrammingPoint\workspace-new\PyTest\tweet_sentiment.py", line 41, in <module>
    main()
  File "F:\ProgrammingPoint\workspace-new\PyTest\tweet_sentiment.py", line 36, in main
    hw()
  File "F:\ProgrammingPoint\workspace-new\PyTest\tweet_sentiment.py", line 23, in hw
    print listval["text"]
  File "C:\Python27\lib\encodings\cp1252.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>
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 8

您的所有转换等都是正确的.问题只是尝试printstdout.

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

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

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

但是如果你的终端不是UTF-8(并且它不是),你需要告诉它如何处理它无法代表的字符.你可以随时encode使用显式errors参数字符串print,如下所示:

print u.encode(sys.stdout.encoding, 'replace')
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,在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.", trus ngedeketin gw, "Tuh kan.. Mirip bang\xe2\x80\xa6'.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.", trus ngedeketin gw, "Tuh kan.. Mirip bang?
Run Code Online (Sandbox Code Playgroud)

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


小智 5

如果您正在使用PyDev Eclipse插件,请尝试转到Windows-> Preferences-> General-> Workspace,然后在TEXT FILE ENCODING左下角选择 - >选择其他= UTF-8

它可能会奏效.