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