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(​​__get​data())
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


здесь



​__get​data() возвращает функция 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() })


но я не уверен, что это правильно способ сделать это.

1539   12  

12 ответов:

ошибка заключается в том, что в словаре есть какой-то не-ascii символ, и он не может быть закодирован/декодирован. Один простой способ избежать этой ошибки-кодировать такие строки с помощью encode() функции следующим образом (если a - это строка с символом не ascii):

a.encode('utf-8').strip()

попробуйте следующий фрагмент кода:

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

ваша строка имеет не 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

    Ничего не найдено.