«Для строки в…» приводит к UnicodeDecodeError: кодек «utf-8» не может декодировать байт

217

Вот мой код,

for line in open('u.item'):
#read each line

всякий раз, когда я запускаю этот код, он выдает следующую ошибку:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

Я попытался решить эту проблему и добавить дополнительный параметр в open (), код выглядит так;

for line in open('u.item', encoding='utf-8'):
#read each line

Но опять же это дает ту же ошибку. что мне тогда делать! Пожалуйста помоги.

SujitS
источник
3
Плохо закодированные данные я бы предположил.
Андреас Юнг
9
Или просто не UTF-8 данных.
Марк Толонен
У нас была эта ошибка с msgpack при использовании python 3 вместо python 2.7. Для нас курс действий заключался в работе с Python 2.7.
Джесси Коллинз

Ответы:

407

Как предложил Марк Рэнсом, я нашел правильную кодировку для этой проблемы. Кодировка была "ISO-8859-1", поэтому замена open("u.item", encoding="utf-8")на open('u.item', encoding = "ISO-8859-1")решит проблему.

SujitS
источник
8
Явное лучше, чем неявное (PEP 20).
Иоаннис Филиппидис
6
Хитрость заключается в том, что ISO-8859-1 или Latin_1 - это 8-битные наборы символов, поэтому весь мусор имеет допустимое значение. Возможно, не использовать, но если вы хотите игнорировать!
Кьельд Фларуп
1
У меня была та же проблема UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xd0 в позиции 32: недопустимый байт продолжения. Я использовал python 3.6.5 для установки aws cli. И когда я попробовал aws --version, он потерпел неудачу с этой ошибкой. Поэтому мне пришлось отредактировать /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py и изменить код на следующий def read (self, filenames, encoding = "ISO-8859-1" ):
Евгений Коптюбенко
3
Существует ли автоматический способ определения кодировки?
OrangeSherbet
5
@OrangeSherbet Я реализовал обнаружение с помощью chardet. Вот один вкладыш (после import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']. Проверьте этот ответ для деталей: stackoverflow.com/a/3323810/615422
VertigoRay
51

Также сработало для меня, ISO 8859-1 собирается сэкономить, хахаха, в основном, если использовать API распознавания речи

Пример:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");
Ryoji Kuwae Neto
источник
4
Вы можете быть правы в том, что OP читает ISO 8859-1, что можно вывести из 0xe9 (é) в сообщении об ошибке, но вы должны объяснить, почему ваше решение работает. Ссылка на API распознавания речи не помогает.
RolfBly
5
Что с точкой с запятой?
Правая нога
29

Ваш файл на самом деле не содержит данных в кодировке utf-8, он содержит другую кодировку. Выясните, что это за кодировка и используйте ее в openвызове.

Например, в кодировке Windows-1252 0xe9символ будет é.

Марк Рэнсом
источник
4
Итак, как я могу узнать, что это за кодировка! Я использую Linux
SujitS
4
Нет способа сделать это всегда, но посмотрите ответ на этот вопрос: stackoverflow.com/questions/436220/…
RemcoGerlich
20

Попробуйте это прочитать с помощью панд

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')
Shashank
источник
Не уверен, почему ты предлагаешь Панд. Решение состоит в том, чтобы установить правильную кодировку, на которую вы случайно наткнулись.
Аластер МакКормак
12

Если вы используете Python 2следующее будет решение:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

Поскольку encodingпараметр не работает с open(), вы получите следующую ошибку:

TypeError: 'encoding' является недопустимым аргументом ключевого слова для этой функции
Jeril
источник
1
Но это версия 3
SujitS
1
Да, я знаю. Я подумал, что это может быть полезно для людей, использующихPython 2
Jeril
У меня тоже работал в Python3
fenkerbb
2
Если вы хотите что-то легче запомнить, 'ISO-8859-1'также известен как 'latin-1'или 'latin1'.
Макс Кандокия
10

Вы можете решить проблему с:

for line in open(your_file_path, 'rb'):

'rb' читает файл в двоичном режиме. Узнайте больше здесь . Надеюсь, это поможет!

Озкар Нгуен
источник
6

Это работает:

open('filename', encoding='latin-1')

или:

open('filename',encoding="IS0-8859-1")
Айша Сиддика
источник
2

Если кто-то ищет это, это пример для преобразования файла CSV в Python 3:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass
user6832484
источник
2

Иногда, когда open(filepath)в filepathдействительности нет файла, может возникнуть та же ошибка, поэтому сначала убедитесь, что файл, который вы пытаетесь открыть, существует:

import os
assert os.path.isfile(filepath)

надеюсь, это поможет.

xtluo
источник
1

Вы можете попробовать так:

open('u.item', encoding='utf8', errors='ignore')
FaridLU
источник
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом. - Из обзора
MartenCatcher