Я использую 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 {}
.
Перед тем, как опубликовать этот вопрос, я передал этот вопрос по поводу 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() })
Но я не уверен, что это правильный способ сделать это.
dict
?dict
имеетlist, dict, python timestamp value
__getdata
. Я не знаю, почему вы получаете не декодируемый персонаж. Вы можете попытаться придумать исправления, чтобы заставить его работать, но они в основном просто требуют дополнительных проблем позже. Я бы попробовал напечатать диктовку, чтобы увидеть, где находится не-ascii символ. Затем выясните, как было вычислено / установлено это поле, и работайте в обратном направлении.Ответы:
Ошибка в том, что в словаре есть какой-то не-ascii символ, и его нельзя кодировать / декодировать. Один простой способ избежать этой ошибки - закодировать такие строки с помощью
encode()
функции следующим образом (еслиa
это строка с не-ascii символом):источник
Я переключил это просто, определив другой пакет кодеков в
read_csv()
команде:encoding = 'unicode_escape'
Например:
источник
pandas
Попробуйте приведенный ниже фрагмент кода:
источник
r
вместоrb
. спасибо за напоминание добавитьb
!open
функция имеет режим «только для чтения».rb
расшифровывается как бинарный режим чтения.В вашей строке
ascii
закодирован не символ.Невозможность декодирования
utf-8
может произойти, если вам нужно использовать другие кодировки в вашем коде. Например:В этом случае кодировка такова
windows-1252
:Теперь, когда у вас есть
Unicode
, вы можете безопасно кодировать вutf-8
.источник
На чтение
csv
я добавил метод кодирования:источник
Установите кодировщик по умолчанию в верхней части вашего кода
источник
По состоянию на 2018-05 это выполняется напрямую
decode
, по крайней мере, для Python 3 .Я использую ниже фрагмент кода для
invalid start byte
иinvalid continuation byte
ошибок типа. Добавлениеerrors='ignore'
исправило это для меня.источник
Вдохновленный @aaronpenne и @Soumyaansh
источник
Это решение сработало для меня:
источник
Простое решение:
источник
Следующая строка повреждает кодер JSON,
Я получил временное решение для этого
Отмечать это так же правильно, как временное исправление (не уверен).
источник
Если вышеуказанные методы не работают для вас, вы можете захотеть изменить кодировку самого файла CSV.
Используя Excel:
Используя Блокнот:
Сделав это, вы сможете импортировать CSV-файлы, не встречая UnicodeCodeError.
источник
После попытки всех вышеупомянутых обходных путей, если это все еще выдает ту же ошибку, вы можете попробовать экспортировать файл как CSV (второй раз, если у вас уже есть). Особенно, если вы используете Scikit Learn, лучше всего импортировать набор данных в виде файла CSV.
Я провел часы вместе, тогда как решение было таким простым. Экспортируйте файл в формате CSV в каталог, где установлены Anaconda или ваши инструменты классификатора, и попробуйте.
источник
Вы можете использовать любую стандартную кодировку вашего конкретного использования и ввода.
utf-8
по умолчанию.iso8859-1
также популярен в Западной Европе.например:
bytes_obj.decode('iso8859-1')
смотри: документы
источник
Вместо того, чтобы искать способы декодирования a5 (Yen
¥
) или 96 (en-dash–
), скажите MySQL, что ваш клиент закодирован как «latin1», но вы хотите, чтобы «utf8» в базе данных.Подробности см. В разделе Проблемы с символами UTF-8; то, что я вижу, не то, что я храню
источник