UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0x80 в позиции 3131: недействительный стартовый байт

Я пытаюсь прочитать данные twitter из json файла, используя python 2.7.12.

Код, который я использовал, таков:

    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

Это не поможет, что у вас есть sys.setdefaultencoding('utf-8'), что еще более запутывает. Это неприятный взлом, и вам нужно удалить его из своего кода. Подробнее см. fooobar.com/questions/12429/...

Ошибка происходит, потому что line является строкой и вы вызываете encode(). encode() имеет смысл только в том случае, если строка является Unicode, поэтому Python пытается сначала преобразовать ее в Unicode, используя кодировку по умолчанию, которая в вашем случае UTF-8, но должна быть ASCII. В любом случае, 0x80 недействителен. ASCII или UTF-8 так терпят неудачу.

0x80 действителен в некоторых наборах символов. В windows-1252/cp1252 it .

Хитрость здесь заключается в том, чтобы понять кодирование ваших данных полностью через ваш код. На данный момент у вас слишком много шансов. Типы строк Unicode - это удобная функция Python, которая позволяет декодировать закодированные строки и забыть о кодировке, пока вам не понадобится писать или передавать данные.

Используйте модуль io, чтобы открыть файл в текстовом режиме и декодировать файл по мере его появления - не более .decode()! Вы должны убедиться, что кодировка ваших входящих данных согласована. Вы можете либо перекодировать его извне, либо изменить кодировку в script. Здесь я установил кодировку 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 распознаются как новые строки, поэтому вам не нужно следить за ними.

Ответ 2

В моем случае (mac os) в моей папке данных был файл .DS_store, который был скрытым и автоматически сгенерированным файлом, и это вызвало проблему. Я смог решить проблему после ее удаления.

Ответ 3

Ошибка возникает, когда вы пытаетесь прочитать твит, содержащий предложение типа

"@Майк http:\www.google.com\A8 & ^) ((&() как есть & ^%() (вы". Который не может быть прочитан как строка, вместо этого вы должны его прочитать как raw String. но преобразование в raw 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 файла.

Вы также можете записать его в csv, используя Pandas.

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

Затем прочитайте из csv, чтобы избежать проблемы с кодировкой и декодированием

надеюсь, что это поможет вам решить вашу проблему.

Midhun