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

Я просмотрел все ответы по схожим вопросам и придумал этот код, и он работал в прошлый раз. Я понятия не имею, почему это не работает сейчас ... Буду признателен за любую помощь!

Ответы на вопрос(3)

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

"@Mike http: \ www.google.com \ A8 & ^) ((&() как дела & ^% () (you ". Который не может быть прочитан как строка, вместо этого предполагается, что он читается как необработанная строка. Но преобразование в необработанную строку все равно дает ошибку, поэтому я лучше рекомендую вам

прочитайте файл 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

 Midhun Mohan27 июл. 2016 г., 11:31
в соответствии с основами jsons загружается как словарь, поэтому data = json.loads (строка) печатает данные ["tweet"] / это даст вам значение ключевого твита
 wannabhappy26 июл. 2016 г., 19:51
По ошибкеValueError: No JSON object could be decoded, Я пытаюсь отладить свой код, так как может быть проблема в другой части кодов ...
 Midhun Mohan23 июл. 2016 г., 06:30
эй, когда я получил ту же ошибку при чтении файла JSON, я смог преодолеть его с помощью приведенного выше кода, поэтому я предложил это. Я ошибаюсь, вы всегда можете исправить меня.
 Midhun Mohan25 июл. 2016 г., 11:23
Это сработало для вас
 wannabhappy24 июл. 2016 г., 22:44
@MidhunMohan, спасибо! Я сослался и на твой код.
 wannabhappy26 июл. 2016 г., 19:46
Нет .... пока нет .. Я изменил ваш код как таковой, так как меня немного смутило то, что вы имели в виду под "твит" и "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)/
 Two-Bit Alchemist22 июл. 2016 г., 22:52
Что вы говорите с этим «не может быть прочитано как строка» и «должно быть преобразовано в необработанную строку». В Python нет такой вещи как необработанная строка. Есть сырая строкалитералы, но вы не можете делать какие-либо преобразования во время выполнения по тем, которые, я надеюсь, являются очевидными причинами.
Решение Вопроса

sys.setdefaultencoding('utf-8'), что еще больше сбивает с толку - это неприятный хак, и вам нужно удалить его из кода. Увидетьhttps://stackoverflow.com/a/34378962/1554386 для дополнительной информации

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

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

Хитрость в том, чтобы понять кодировку ваших данных на всем протяжении вашего кода. На данный момент вы оставляете слишком много на волю случая. Unicode String типы - это удобная функция 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 обнаруживаются как новые строки, поэтому вам не нужно следить за ними.

 wannabhappy26 июл. 2016 г., 19:59
Спасибо!! Я начну оттуда снова!
 wannabhappy23 июл. 2016 г., 22:07
Код работает, но я получаю «NULL» для всех переменных в базе данных. Когда я открыл каждый файл json и проверил, в нем есть твиты. Кроме того, когда я просил напечатать количество твитов, он говорит, что у меня 0 твитов ....
 wannabhappy26 июл. 2016 г., 19:35
Привет :) попробовалrрежим, и это дало мне ошибку как таковую:ValueError: No JSON object could be decoded, Так что яa+ вместо этого в моем коде. Будет ли это проблемой ...? Я думал, что проблема исходит откуда-то еще ..
 Alastair McCormack23 июл. 2016 г., 15:07
Какая ошибка у вас сейчас?
 Alastair McCormack26 июл. 2016 г., 19:38
a+ означает открыть файл для обновления и добавить в конецвсегда, Измените его обратно наr, затемprint line а затем выяснить, почему JSON не может быть декодирован.
 Alastair McCormack25 июл. 2016 г., 09:58
Каждая строка читается правильно?print line ?
 wannabhappy25 июл. 2016 г., 23:08
Я немного смущен .. Я думаю, вы имеете в виду, когда яprint line сразу послеtweet=json.loads(line)? В этом случае ничего не распечатывается ..
 wannabhappy23 июл. 2016 г., 02:34
Спасибо!!! Я только что попробовал, но это не работает - я пытаюсь заменить «Windows-1252», как я использую Mac. Я пробовал «латиницу-1» и т. Д. Или это не имеет значения ...? Спасибо за подробное объяснение ...
 Alastair McCormack24 июл. 2016 г., 01:41
Вам нужно будет отладить свой код и выяснить, что не работает. Похоже, мое решение сработало, но вы что-то упустили. Что произойдет, если выprint tweet в твоем цикле?
 Alastair McCormack26 июл. 2016 г., 09:57
В приведенном мною примере была ошибка - режим файла должен был бытьr, Это выдаст ошибку сrw, Какой код у тебя есть?
 wannabhappy24 июл. 2016 г., 22:41
Хорошо. Я пытаюсь отладить код ... Это дает мне пустой список, т.е.[ ], Огромное спасибо!!

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

 Blue Moon29 мар. 2019 г., 14:56
тоже самое. Спасибо!
 doron28 мар. 2019 г., 12:53
да! благодарю вас! я просто добавил оператор if только для чтения .txt файлов и он работает
 Alon Eirew03 окт. 2018 г., 16:25
Спасибо Сунг! Это была та же проблема для меня в Mac OS, я в конечном итоге проигнорировал файл в коде, так как он будет заново сгенерирован операционной системой, и я не был уверен, насколько безопасно будет окончательно удалить его ...

Ваш ответ на вопрос