"Для рядка в ..." призводить до UnicodeDecodeError: "utf-8" кодек не може розшифрувати байт


214

Ось мій код,

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

Але знову ж таки вона дає ту саму помилку. що мені робити тоді! Будь ласка, допоможіть.


3
Думаю, погано закодовані дані.
Андреас Юнг

9
Або просто не дані UTF-8.
Марк Толонен


У нас була помилка з msgpack при використанні python 3 замість python 2.7. Для нас хід дії полягав у роботі з python 2.7.
Джессі У. Коллінз

Відповіді:


403

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


8
Явне краще, ніж неявне (PEP 20).
Іоанніс Філіппідіс

6
Хитрість полягає в тому, що ISO-8859-1 або Latin_1 - це 8-бітові набори символів, тому все сміття має дійсне значення. Можливо, не корисний, але якщо ви хочете ігнорувати!
К'єльд Фларуп

1
У мене був той самий випуск UnicodeDecodeError: 'utf-8' кодек не може декодувати байт 0xd0 в позиції 32: недійсний байт продовження. Я використовував python 3.6.5 для встановлення Aws cli. І коли я спробував aws --версія, це не вдалося з цією помилкою. Тому мені довелося відредагувати /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py і змінив код на наступне def read (self, filename, 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");

4
Можливо, ви маєте рацію, що ОП читає 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')

Не знаєте, чому ви пропонуєте Pandas. Рішенням є встановлення правильного кодування, яке ви тут продемонстрували.
Аластер Маккормак

12

Якщо ви використовуєте Python 2наступне, буде рішення:

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

Оскільки encodingпараметр не працює open(), ви отримаєте таку помилку:

TypeError: 'кодування' є недійсним аргументом ключового слова для цієї функції

1
Але це версія 3
SujitS

1
Так, я знаю. Я подумав, що це може бути корисно для людей, які використовуютьPython 2
Джеріл

Працював для мене і в Python3
fenkerbb

2
Якщо ви хочете щось легше запам’ятати, 'ISO-8859-1'також відомий як 'latin-1'або 'latin1'.
Макс Кандокія

9

Ви можете вирішити проблему за допомогою:

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

'rb' - це читання файлів у двійковому режимі. Детальніше читайте тут . Сподіваюся, це допоможе!



2

Якщо хтось шукає їх, це приклад для перетворення CSV-файлу в Python 3:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

Іноді, коли open(filepath)в якому filepathнасправді немає файлу, виникає однакова помилка, тому спочатку переконайтеся, що існує файл, який ви намагаєтесь відкрити:

import os
assert os.path.isfile(filepath)

сподіваюся, що це допоможе.


1

ви можете спробувати так:

open('u.item', encoding='utf8', errors='ignore')

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією. - З огляду
MartenCatcher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.