Подтвердить что ты не робот

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

Прежде чем отправлять этот вопрос, я упомянул this вопроса os 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() })

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

encoding = 'unicode_escape'

Ответ 4

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

В этом случае кодировка является окном-1252, поэтому вам нужно сделать:

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

Теперь, когда у вас есть юникод, вы можете безопасно закодировать в utf-8.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

По состоянию на 2018-05 это выполняется непосредственно с decode, по крайней мере для Python 3.

Я использую приведенный ниже фрагмент после получения invalid start byte и invalid continuation byte ошибок типа invalid continuation byte. Добавление errors='ignore' исправило это для меня.

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

Используя Excel:

  1. Открыть CSV файл с помощью Excel
  2. Перейдите к пункту "Файл меню" и нажмите "Сохранить как"
  3. Нажмите "Обзор", чтобы выбрать место для сохранения файла.
  4. Введите предполагаемое имя файла
  5. Выберите параметр CSV (с разделителями-запятыми) (*.csv)
  6. Нажмите "Инструменты" в раскрывающемся списке и нажмите "Веб-параметры"
  7. На вкладке "Кодировка" выберите опцию Unicode (UTF-8) в раскрывающемся списке "Сохранить этот документ".
  8. Сохранить файл

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

  1. Открыть CSV файл с помощью блокнота
  2. Перейдите к "Файл"> "Сохранить как" вариант
  3. Далее выберите место для файла
  4. Выберите опцию Сохранить как тип как Все файлы (.)
  5. Укажите имя файла с расширением .csv
  6. В раскрывающемся списке "Кодировка" выберите параметр UTF-8.
  7. Нажмите Сохранить, чтобы сохранить файл

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

Ответ 11

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

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

Ответ 12

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

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

например

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

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

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

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

Ответ 13

Просто в моем случае, если я сохраню файл xslx excel как CSV (с разделителями-запятыми), появится ошибка. Однако, когда я сохраняю как CSV (MS-DOS), ошибка не появляется.

Ответ 14

HitHere, вы должны сначала загрузить файл "GoogleNews-vectors-absolute300.bin.gz", а затем извлечь его с помощью этой команды в Ubuntu: gunzip -k GoogleNews-vectors-positive300.bin.gz. [извлечение вручную никогда не рекомендуется].

во-вторых, вы должны применить эти команды в Python 3:

import gensim
model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True)

Надеюсь это будет полезно.