ошибка 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. оттуда это будет расшифровано и отделено линиями.


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
Николай Кристиансен,


15

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

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

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


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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.