2016-07-22 175 views
4

我正在尝试使用python 2.7.12从json文件读取twitter数据。我用UnicodeDecodeError:'utf8'编解码器无法解码位置3131中的字节0x80:无效起始字节

代码是这样的:

import json 
    import sys 
    reload(sys) 
    sys.setdefaultencoding('utf-8') 

    def get_tweets_from_file(file_name): 
     tweets = [] 
     with open(file_name, 'rw') as twitter_file: 
      for line in twitter_file: 
       if line != '\r\n': 
        line = line.encode('ascii', 'ignore') 
        tweet = json.loads(line) 
        if u'info' not in tweet.keys(): 
         tweets.append(tweet) 
    return tweets 

结果我:

Traceback (most recent call last): 
     File "twitter_project.py", line 100, in <module> 
     main()     
     File "twitter_project.py", line 95, in main 
     tweets = get_tweets_from_dir(src_dir, dest_dir) 
     File "twitter_project.py", line 59, in get_tweets_from_dir 
     new_tweets = get_tweets_from_file(file_name) 
     File "twitter_project.py", line 71, in get_tweets_from_file 
     line = line.encode('ascii', 'ignore') 
    UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte 

我通过从类似问题的所有答案,去与这个代码走过来,它的工作最后一次。我不知道为什么它现在不工作...我会很感激任何帮助!

回答

9

它不会帮助你有sys.setdefaultencoding('utf-8'),这是令人困惑的事情进一步 - 这是一个讨厌的黑客,你需要从你的代码中删除它。 了解更多信息

的错误发生,因为line是一个字符串,你打电话encode()https://stackoverflow.com/a/34378962/1554386encode()只有在字符串是Unicode时才有意义,因此Python会首先使用默认编码将其转换为Unicode,这在您的情况下为UTF-8,但应该是ASCII。无论哪种方式,0x80是无效的ASCII或UTF-8如此失败。

0x80在某些字符集中有效。在windows-1252/cp1252它是

这里的诀窍是理解您的数据在整个代码中的编码。目前,你离开的机会太多了。 Unicode字符串类型是一个方便的Python功能,它允许您解码编码的字符串并忘记编码,直到您需要编写或传输数据为止。

使用io模块以文本模式打开文件并解压文件 - 不再需要.decode()!您需要确保传入数据的编码一致。您可以对其进行外部编码或更改脚本中的编码。这里是我设置的编码为windows-1252

with io.open(file_name, 'r', encoding='windows-1252') as twitter_file: 
    for line in twitter_file: 
     # line is now a <type 'unicode'> 
     tweet = json.loads(line) 

io模块还提供Universal Newlines。这意味着\r\n被检测为换行符,所以您不必监视它们。

+0

谢谢!!!我只是尝试,但它不工作 - 我试图取代'windows-1252',因为我正在使用mac。我尝试了'拉丁-1'等。或者没关系......?感谢您的详细解释... – wannabhappy

+0

你现在有什么错误? –

+0

代码运行但我得到数据库中所有变量的“NULL”。 当我打开每个json文件并检查时,文件中有tweet。另外,当我要求打印多条推文时,它说我有0条推文...... – wannabhappy

-2

当你试图读取包含句子鸣叫像

“@Mike HTTP出现的错误:\ www.google.com \ A8 & ^)((&()是如何& ^% ()(你。”这不能被理解为一个字符串,而不是你想读它作为原始字符串。 但转换为原始字符串仍然给出错误,所以我更好,我建议你

读取JSON文件类似这个:

import codecs 
import json 
    with codecs.open('tweetfile','rU','utf-8') as f: 
      for line in f: 
       data=json.loads(line) 
       print data["tweet"] 
keys.append(data["id"]) 
      fulldata.append(data["tweet"]) 

这将让你从json文件中加载数据。

您也可以使用Pandas将其写入csv。

import pandas as pd 
output = pd.DataFrame(data={ "tweet":fulldata,"id":keys}) 
output.to_csv("tweets.csv", index=False, quoting=1) 

然后从CSV阅读,避免编码和解码问题

希望这将帮助你解决你的问题。

Midhun

+1

你在说什么“不能读为字符串”和“必须转换为原始字符串”。 Python中没有这样的东西作为原始字符串。有原始字符串_literals_,但你不能做任何运行时转换为那些我希望是显而易见的原因。 –

+0

嘿,当我阅读json文件时出现同样的错误,我能够通过上面的代码克服它,这就是为什么我建议它。我错了,你总是欢迎纠正我。 –

+0

@MidhunMohan,谢谢!我也提到你的代码。 – wannabhappy

3

在我的情况下(mac os),我的数据文件夹中存在.DS_store文件,这是一个隐藏的和自动生成的文件,它引起了问题。删除后我能解决问题。

相关问题