ошибка UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

164

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

Произошла ошибка при компиляции «process.py» на вышеуказанном сайте.

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

Traceback (последний вызов был последним):

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

В чем причина ошибки? Версия Python - 3.5.2.

пирог
источник

Ответы:

196

Python пытается преобразовать байтовый массив ( bytesкоторый он считает строкой в ​​кодировке utf-8) в строку Unicode ( str). Этот процесс, конечно, является декодированием в соответствии с правилами utf-8. Когда он пытается это сделать, он встречает последовательность байтов, которая не разрешена в строках с кодировкой utf-8 (а именно, это 0xff в позиции 0).

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

Из трассировки стека можно предположить, что инициирующим действием было чтение из файла ( contents = open(path).read()). Я предлагаю перекодировать это так:

with open(path, 'rb') as f:
  contents = f.read()

Что bв спецификаторе режима указано, open()что файл должен быть обработан как двоичный, поэтому contentsон останется bytes. Попытка декодирования таким образом не произойдет.

Альфей
источник
Я получаю сообщение об ошибке «ValueError: строка Режим должен начинаться с одной из„г“,„ж“,„а“или„U“, а не" бр»
Унникришнан
3
@Unnikrishnan Хорошо, тогда используйте rb(я думал, что порядок не имеет значения, но, кажется, по крайней мере, в некоторых системах / версиях). Я изменил свой ответ соответственно.
Alfe
58
byte 0xff in position 0Это также может означать, что файл закодирован в формате UTF-16, with open(path, encoding='utf-16') as f:вместо этого вы можете сделать это
Николай Р Кристиансен,
Что если на самом деле нет 0xffперсонажа на этой позиции 0? И это UTF-8закодировано.
Юлиан
Чистый '\xFF'символ будет закодирован в UTF-8 как '\xC3\xBF'. UTF-8 кодирует все символы с установленным MSB, используя два символа. (См. Вывод printf "\xff" | iconv -f latin1 -t utf-8 | xxdв оболочке.) Дословно '\xFF'в начале строки в кодировке UTF-8 указана ошибка кодирования (может быть названа синтаксической ошибкой в ​​терминах UTF-8).
Альфе
83

Используйте это решение, оно удалит (проигнорирует) символы и вернет строку без них. Используйте это только если вам нужно раздеть их, а не конвертировать.

with open(path, encoding="utf8", errors='ignore') as f:

Используя errors='ignore' Вы просто потеряете некоторых персонажей. но если вы не заботитесь о них, поскольку они кажутся лишними символами, происходящими из-за неправильного форматирования и программирования клиентов, подключающихся к моему серверу сокетов. Тогда это простое прямое решение. ссылка

Нитиш Кумар Пал
источник
6
Работает и для decode (): contents = contents.decode('utf-8', 'ignore')Источник: docs.python.org/3/howto/unicode.html#the-string-type
naaman
2
Должно быть лучшим ответом
Стэтхэм
лучшее решение в моем случае :)
maestromusica
Когда вы говорите «потерять несколько символов», вы имеете в виду, что файл с ошибками не будет прочитан? или что не все содержимое этого файла будет прочитано?
msoutopico
@msoutopico. Поскольку игнорируются ошибки, некоторые кодировки не читаются, что вызывает проблемы. Но никогда не сталкивался с контентом, пропущенным во время чтения. Так что в основном проблемы с кодированием игнорируются.
Нитиш Кумар Пал
23

Была проблема, похожая на эту, закончилась использованием UTF-16 для декодирования. мой код ниже.

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

это будет принимать содержимое файла как импорт, но будет возвращать код в формате UTF. оттуда это будет расшифровано и отделено линиями.

tattmoney76
источник
10
В Python 3 вы можете упростить это, используя параметр кодированияwith open(path, encoding='utf-16') as f
Николай Р. Кристиансен,
@NikolaiRKristiansen Я пытался использовать ваш метод, но получил ошибку как TypeError: an integer is required (got type str). Зачем? Оба файла являются двоичными и читаются как rb.
Богота
1
@Bogota Параметр encodingимеет смысл только при чтении текста. Удалите «b» из аргумента mode и попробуйте снова. Подробнее читайте в документации: docs.python.org/3/library/functions.html#open
Николай Кристиансен,
19

Используйте формат кодировки ISO-8859-1 для решения этой проблемы.

Раминени Рави Теджа
источник
1
Наконец попал на это после попытки 10+ других кодировок!
Rexcirus
15

Я сталкивался с этой темой, когда сталкивался с той же ошибкой, после некоторых исследований, которые я могу подтвердить, эта ошибка возникает, когда вы пытаетесь декодировать файл UTF-16 с помощью UTF-8.

В UTF-16 первый символ (2 байта в UTF-16) представляет собой метку порядка байтов (BOM) , которая используется в качестве подсказки декодирования и не отображается как символ в декодированной строке. Это означает, что первый байт будет либо FE, либо FF, а второй - другим.

Сильно отредактировано после того, как я узнал реальный ответ

Питер Огден
источник
Это закончилось 2 часа головной боли! Открытие файла с open ('filename', 'r') как f: и затем печать его содержимого показывает UTF-8, что неверно.
nulldroid
4

использовать только

base64.b64decode(a) 

вместо того

base64.b64decode(a).decode('utf-8')
Прадип Карунатхилака
источник
2
это работает, но просто чтобы понять, можете ли вы объяснить, почему, пожалуйста? :)
Идо Блейхер
3

Если у вас Mac, проверьте наличие скрытого файла .DS_Store. После удаления файла моя программа сработала.

Хуан Наваррете
источник
1

Проверьте путь к файлу для чтения. Мой код продолжал давать мне ошибки, пока я не изменил имя пути на текущий рабочий каталог. Ошибка была:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Rex131xO
источник
1

если вы получаете данные от последовательного порта, убедитесь, что вы используете правильную скорость передачи данных (и другие конфигурации): декодирование с использованием ( utf-8 ), но неправильная конфигурация вызовет ту же ошибку

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

чтобы проверить конфигурацию вашего последовательного порта в Linux: stty -F /dev/ttyUSBX -a

Саиф Файди
источник
1

Это просто означает, что вы выбрали неправильную кодировку для чтения файла.

На Mac используйте, file -I file.txtчтобы найти правильную кодировку. В Linux используйте file -i file.txt.

Минь Триет
источник
0

У меня та же проблема при обработке файла, созданного в Linux. Оказывается, это было связано с файлами, содержащими вопросительные знаки.

Вим Фолкертс
источник
-1

У меня была похожая проблема.

Решил это:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

Однако у меня была другая проблема. Некоторые html-файлы (в моем случае) не были utf-8, поэтому я получил похожую ошибку. Когда я исключил эти HTML-файлы, все работало гладко.

Поэтому, кроме исправления кода, проверьте также файлы, из которых вы читаете, возможно, там действительно есть несовместимость.

Костас Цилигкирис
источник
-5

Если возможно, откройте файл в текстовом редакторе и попробуйте изменить кодировку на UTF-8. В противном случае сделайте это программно на уровне ОС.

Манодж Джоши
источник
-5

У меня аналогичная проблема. Я пытаюсь запустить пример в tenorflow / models /jective_detection и встретил то же сообщение. Попробуйте изменить Python3 на Python2

user8665083
источник