UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0xa5 в позиции 0: недопустимый начальный байт
Я использую Python-2.6 CGI скрипты, но нашли эту ошибку в журнале сервера при выполнении json.dumps(),
Traceback (most recent call last):
File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
print json.dumps(__getdata())
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte
здесь
__getdata() возвращает функция dictionary {} .
прежде чем отправлять на этот вопрос я уже упоминал этой вопрос ОС.
обновления
следующая строка вредит кодировщику JSON,
now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit
я получил временное исправление для него
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
но я не уверен, что это правильно способ сделать это.
12 ответов:
ошибка заключается в том, что в словаре есть какой-то не-ascii символ, и он не может быть закодирован/декодирован. Один простой способ избежать этой ошибки-кодировать такие строки с помощью
encode()функции следующим образом (еслиa- это строка с символом не ascii):a.encode('utf-8').strip()
ваша строка имеет не ascii символ, закодированный в нем.
невозможность декодирования с помощью utf-8 может произойти, если вам нужно использовать другие кодировки в вашем коде. Например:
>>> 'my weird character \x96'.decode('utf-8') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byteв этом случае кодировка windows-1252, так что вы должны сделать:
>>> 'my weird character \x96'.decode('windows-1252') u'my weird character \u2013'теперь, когда у вас есть unicode, вы можете безопасно кодировать в utf-8.
я переключил это, просто определив другой пакет кодека в команде read_csv ()
encoding = 'unicode_escape'
установите кодировщик по умолчанию в верхней части кода
import sys reload(sys) sys.setdefaultencoding("ISO-8859-1")
следующая строка вредит кодировщику JSON,
now = datetime.datetime.now() now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ') print json.dumps({'current_time': now}) // this is the culpritЯ получил временное исправление для него
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })маркировка это как правильно, как временное исправление (не уверен, что так).
по состоянию на 2018-05 это обрабатывается непосредственно с
decode, по крайней мере для Python 3.я использую ниже фрагмент после получения
invalid start byteиinvalid continuation byteошибки типа. Добавлениеerrors='ignore'исправил это для меня.with open(out_file, 'rb') as f: for line in f: print(line.decode(errors='ignore'))
после попытки всех вышеупомянутых обходных путей, если он по-прежнему выдает ту же ошибку, вы можете попробовать экспортировать файл в формате CSV (во второй раз, если у вас уже есть). Особенно если вы используете scikit learn, лучше всего импортировать набор данных в виде CSV-файла.
Я провел несколько часов вместе, в то время как решение было таким простым. Экспортируйте файл в формате CSV в каталог, где установлена Anaconda или ваши инструменты классификатора, и попробуйте.
вообще говоря,
Python выдает такую ошибку, когда незаконный тип объекта пытаются прочитать как файл.
например
file = open("xyz.pkl", "r") text= file.read()вторая строка выдаст вышеуказанную ошибку:
UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0x80 в позиции 0: недопустимый начальный байт
читать .npy подобным образом будет также бросать такого рода ошибки
вдохновленный aaronpenne и Soumyaansh
f = open("file.txt","rb") text = f.read().decode(errors='replace')
только в моем случае, если я сохраню файл xslx excel в виде CSV (с разделителями-запятыми), появится ошибка. Однако, когда я сохраняю как CSV (MS-DOS), ошибка не придет.
здесь вы должны загрузить "GoogleNews-vectors-negative300.бункер.файл gz " сначала извлеките его этой командой в Ubuntu: gunzip-k GoogleNews-vectors-negative300.бункер.ГЗ. [извлечение вручную никогда не рекомендуется].
во-вторых, вы должны применить эти команды в python 3:
import gensim model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True)Я надеюсь, что это будет полезно.
Comments