【问题标题】:UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byteUnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节
【发布时间】: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

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

【问题讨论】:

    标签: json python-2.7 utf-8 ascii python-unicode


    【解决方案1】:

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

    【讨论】:

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

    sys.setdefaultencoding('utf-8') 对您没有帮助,这会进一步混淆事情 - 这是一个令人讨厌的 hack,您需要将其从代码中删除。 更多信息请见https://stackoverflow.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。我正在尝试调试我的代码,因为代码的其他部分可能存在问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2014-04-08
    • 2013-10-02
    相关资源
    最近更新 更多