UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte

我正在尝试使用 python 2.7.12.

从 json 文件中读取 Twitter 数据

我使用的代码是这样的:

    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

我仔细阅读了类似问题的所有答案并提出了这段代码并且上次它有效。我不知道为什么它现在不起作用。

当您尝试阅读包含像

这样的句子的推文时会发生错误

"@Mike http:\www.google.com \A8&^)((&() 怎么样&^%()( 你 "。不能读作一个 String 而不是你应该把它读作原始 String 。 但是转换为原始字符串仍然会出错所以我最好建议你

读取 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读取,避免编解码问题

希望这能帮助您解决问题。

米敦

您拥有 sys.setdefaultencoding('utf-8') 并没有帮助,这进一步混淆了事情 - 这是一个令人讨厌的 hack,您需要将其从您的代码中删除。 有关详细信息,请参阅

发生错误是因为 line 是一个字符串,而您正在调用 encode()encode() 仅当字符串是 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 模块还提供通用换行符。这意味着 \r\n 被检测为换行符,因此您不必注意它们。

在我的例子中(mac os),我的数据文件夹中有 .DS_store 文件,这是一个隐藏的自动生成文件,它导致了问题。删除后我能够解决问题。

对于其他因错误消息而遇到此问题的人,我 运行 在尝试以文本模式而不是二进制模式打开 pickle 文件时遇到此错误。

这是原始代码:

import pickle as pkl
with open(pkl_path, 'r') as f:
    obj = pkl.load(f)

这修复了错误:

import pickle as pkl
with open(pkl_path, 'rb') as f:
    obj = pkl.load(f)