it-swarm.com.ru

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 {}.

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


ОБНОВЛЕНИЕ

Следующая строка повреждает кодировщик 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() })

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

75
Dipak Ingole

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

a.encode('utf-8').strip()
49
Santosh Ghimire

Попробуйте приведенный ниже фрагмент кода:

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

Ваша строка содержит код, не являющийся символом 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.

26
JCF

Я переключил это просто, определив другой пакет кодеков в команде read_csv()

encoding = 'unicode_escape'
23
MSalty

Установите кодировщик по умолчанию в верхней части вашего кода

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
10
HimalayanCoder

Вдохновленный Ааронпенном и Соумяаншем

f    = open("file.txt","rb")
text = f.read().decode(errors='replace')
9
Punnerud

На чтение CSV я добавил метод кодирования

import pandas as pd
dataset = pd.read_csv('sample_data.csv',header=0,encoding = 'unicode_escape')
5
Krishna prasad.m

По состоянию на 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'))
4
aaronpenne

Следующая строка повреждает кодировщик 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() })

Отмечать это так же правильно, как временное исправление (не уверен).

3
Dipak Ingole

После попытки всех вышеупомянутых обходных путей, если он все еще выдает ту же ошибку, вы можете попробовать экспортировать файл как CSV (второй раз, если у вас уже есть) . Особенно, если вы используете Scikit Learn, лучше всего импортировать набор данных в виде файла CSV.

Я провел часы вместе, тогда как решение было таким простым. Экспортируйте файл в формате CSV в каталог, где установлены Anaconda или ваши инструменты классификатора, и попробуйте.

1
Sushmita

Если вышеупомянутые методы не работают для вас, вы можете захотеть изменить кодировку самого файла CSV.

Используя Excel:

1. Open csv file using Excel
2. Navigate to "File menu" option and click "Save As"
3. Click "Browse" to select a location to save the file
4. Enter intended filename
5. Select CSV (Comma delimited) (*.csv) option
6. Click "Tools" drop-down box and click "Web Options"
7. Under "Encoding" tab, select the option Unicode (UTF-8) from "Save this document as" drop-down list
8. Save the file

Используя Блокнот:

1. Open csv file using notepad
2. Navigate to "File" > "Save As" option
3. Next, select the location to the file
4. Select the Save as type option as All Files(*.*)
5. Specify the file name with .csv extension
6. From "Encoding" drop-down list, select UTF-8 option.
7. Click Save to save the file

Сделав это, вы сможете импортировать CSV-файлы, не встречая UnicodeCodeError.

1
Zuo

Вообще говоря, 

Python выдает такую ​​ошибку, когда недопустимый тип объекта пытаются прочитать как файл.

например 

file = open("xyz.pkl", "r") text= file.read()

вторая строка выдаст вышеуказанную ошибку: 

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

Возможное чтение .npy аналогичным образом также приведет к появлению такого рода ошибки. 

0
Priyank Pathak