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 {}
.
Прежде чем отправлять этот вопрос, я упомянул 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() })
Но я не уверен, что это правильный способ сделать это.
Ответы
Ответ 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:
- Открыть CSV файл с помощью Excel
- Перейдите к пункту "Файл меню" и нажмите "Сохранить как"
- Нажмите "Обзор", чтобы выбрать место для сохранения файла.
- Введите предполагаемое имя файла
- Выберите параметр CSV (с разделителями-запятыми) (*.csv)
- Нажмите "Инструменты" в раскрывающемся списке и нажмите "Веб-параметры"
- На вкладке "Кодировка" выберите опцию Unicode (UTF-8) в раскрывающемся списке "Сохранить этот документ".
- Сохранить файл
Используя Блокнот:
- Открыть CSV файл с помощью блокнота
- Перейдите к "Файл"> "Сохранить как" вариант
- Далее выберите место для файла
- Выберите опцию Сохранить как тип как Все файлы (.)
- Укажите имя файла с расширением .csv
- В раскрывающемся списке "Кодировка" выберите параметр UTF-8.
- Нажмите Сохранить, чтобы сохранить файл
Сделав это, вы сможете импортировать 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)
Надеюсь это будет полезно.