我正在尝试按照数据科学课程的介绍.但是我试图解析来自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 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 & 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的新来者,任何帮助将不胜感激.
您的所有转换等都是正确的.问题只是尝试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 & 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 & 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
它可能会奏效.