UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节

Posted

技术标签:

【中文标题】UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节【英文标题】:UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte 【发布时间】:2016-11-25 20:38:45 【问题描述】:

我正在尝试使用 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

我查看了类似问题的所有答案,并想出了这段代码,它上次工作。我不知道为什么它现在不起作用...我将不胜感激!

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢宋!在 Mac OS 上对我来说也是同样的问题,我最终忽略了代码中的文件,因为它会被操作系统重新生成,我不确定永久删除它有多安全......跨度> 是的!谢谢!我只是添加了一个 if 语句来只读 .txt 文件,它可以工作 这里也一样,我使用的 os.listdir() 仅包含 .csv 文件,而这个 .DS_Store 正在产生问题。使用 try 和 except 轻松解决。【参考方案2】:

sys.setdefaultencoding('utf-8') 对您没有帮助,这会进一步混淆事情 - 这是一个令人讨厌的 hack,您需要将其从代码中删除。 更多信息请见https://***.com/a/34378962/1554386

发生错误是因为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 被检测为换行符,因此您不必注意它们。

【讨论】:

谢谢!!!我刚刚尝试过,但它不起作用 - 我正在尝试替换“windows-1252”,因为我正在使用 mac。我试过'latin-1'等。或者没关系......?感谢您的详细解释... 代码运行,但我得到数据库中所有变量的“NULL”。当我打开每个 json 文件并检查时,文件中有推文。此外,当我要求打印推文数量时,它说我有 0 条推文...... 您将需要调试您的代码并找出不工作的地方。听起来我的解决方案已经奏效,但你错过了一些东西。如果你在你的 for 循环中 print tweet 会发生什么? 好的。我正在尝试调试代码...它给了我空白列表,即[ ]。非常感谢!! 我有点困惑..我猜你的意思是当我print line 紧跟在tweet=json.loads(line) 之后?在这种情况下,什么都不会打印出来..【参考方案3】:

当您尝试阅读包含类似句子的推文时会发生错误

"@Mike http:\www.google.com \A8&^)((&() how are&^%()( you "。不能将其读取为字符串,而是您是假设将其读取为原始 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读取,避免编解码问题

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

弥敦道

【讨论】:

你在说什么“不能读取为字符串”和“必须转换为原始字符串”。 Python 中没有原始字符串这样的东西。有原始字符串 literals,但出于我希望是显而易见的原因,您不能对那些进行任何运行时转换。 嘿,当我在读取 json 文件时遇到同样的错误时,我能够通过上面的代码克服它,这就是我建议它的原因。我错了,随时欢迎您纠正我。 @MidhunMohan,谢谢!我也提到了你的代码。 不..还没有..我改变了你的代码,因为我有点困惑你所说的“tweet”和“id”是什么意思。 with codecs.open(file_name,'rU','utf-8') as twitter_file:/ for line in twitter_file:/ tweet = json.loads(line)/ print line/ if u'info' not in tweet.keys():/ tweets.append(tweet)/ 据此错误为ValueError: No JSON object could be decoded。我正在尝试调试我的代码,因为代码的其他部分可能存在问题...

以上是关于UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xa5:无效的起始字节

Django:/accounts/ProfileDetails/'utf8' 处的 UnicodeDecodeError 编解码器无法解码位置 5915 中的字节 0xe1:无效的继续字节

flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方

python-使用pip安装第三方库报UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 7

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