Error UnicodeDecodeError: кодек "utf-8" не может декодировать байт 0xff в позиции 0: недопустимый стартовый байт
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.
Ответы
Ответ 1
Python пытается преобразовать байтовый массив (a 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
. Никакая попытка декодирования не будет таким образом.
Ответ 2
Используйте это решение, оно удалит (проигнорирует) символы и вернет строку без них. Используйте это только если вам нужно раздеть их, а не конвертировать.
with open(path, encoding="utf8", errors='ignore') as f:
Используя errors='ignore'
вы просто потеряете несколько символов. но если вы не заботитесь о них, так как они кажутся лишними символами, происходящими из-за неправильного форматирования и программирования клиентов, подключающихся к моему серверу сокетов. Тогда это простое прямое решение. ссылка
Ответ 3
Была проблема, подобная этой, закончена с использованием 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. оттуда он будет декодирован и разделен линиями.
Ответ 4
Я сталкивался с этой темой, когда сталкивался с той же ошибкой, после некоторого исследования, которое я могу подтвердить, эта ошибка возникает, когда вы пытаетесь декодировать файл UTF-16 с помощью UTF-8.
В UTF-16 первый символ (2 байта в UTF-16) представляет собой метку порядка байтов (BOM), которая используется в качестве подсказки декодирования и не отображается как символ в декодированной строке. Это означает, что первый байт будет либо FE, либо FF, а второй - другим.
Сильно отредактировано после того, как я узнал реальный ответ
Ответ 5
Прочитайте (r) файл CSV details.csv и закодируйте с помощью utf8. если ошибка игнорировать ошибку, Это просто сделать с помощью следующего кода.
with open('details.csv', 'r',encoding="utf8", errors='ignore') as csvDataFile:
csvReader = csv.DictReader(csvDataFile)
Ответ 6
использовать только
base64.b64decode(a)
вместо
base64.b64decode(a).decode('utf-8')
Ответ 7
Если вы используете Mac, проверьте наличие скрытого файла .DS_Store. После удаления файла моя программа сработала.
Ответ 8
Проверьте путь к файлу, который нужно прочитать. Мой код продолжал давать мне ошибки, пока я не изменил имя пути для представления рабочего каталога. Ошибка:
newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Ответ 9
HitHere, вы должны сначала загрузить файл "GoogleNews-vectors-positive300.bin.gz", а затем извлечь его с помощью этой команды в Ubuntu: gunzip -k GoogleNews-vectors-positive300.bin.gz. [извлечение вручную никогда не рекомендуется]. во-вторых, вы должны применить эти команды в pyrhon 3:
import gensim model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True).
Надеюсь это будет полезно.
Ответ 10
если вы получаете данные от последовательного порта, убедитесь, что вы используете правильную скорость передачи данных (и другие конфигурации): декодирование с использованием (utf-8), но неправильная конфигурация вызовет ту же ошибку
UnicodeDecodeError: кодек "utf-8" не может декодировать байт 0xff в позиции 0: недопустимый начальный байт
чтобы проверить конфигурацию последовательного порта в Linux, используйте: stty -F/dev/ttyUSBX -a
Ответ 11
Используйте формат кодировки ISO-8859-1 для решения проблемы.
Ответ 12
У меня аналогичная проблема. Я пытаюсь запустить пример в tensorflow/models/object_detection и встретить одно и то же сообщение.
Попробуйте изменить Python3 на Python2
Ответ 13
Если возможно, откройте файл в текстовом редакторе и попробуйте изменить кодировку на UTF-8. В противном случае сделайте это программно на уровне ОС.