Я пытаюсь работать с очень большим набором данных, в котором есть нестандартные символы. Мне нужно использовать юникод в соответствии со спецификациями работы, но я сбит с толку. (И вполне возможно, что все делаю неправильно.)
Я открываю CSV, используя:
15 ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')
Затем я пытаюсь закодировать его с помощью:
name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
Я кодирую все, кроме lat и lng, потому что их нужно отправить в API. Когда я запускаю программу для синтаксического анализа набора данных, чтобы получить то, что я могу использовать, я получаю следующую трассировку.
Traceback (most recent call last):
File "push_into_db.py", line 80, in <module>
main()
File "push_into_db.py", line 74, in main
district_map = buildDistrictSchoolMap()
File "push_into_db.py", line 32, in buildDistrictSchoolMap
county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
Думаю, мне следует сказать вам, что я использую python 2.7.2, и это часть сборки приложения на django 1.4. Я прочитал несколько сообщений по этой теме, но ни один из них, похоже, не применим напрямую. Любая помощь будет оценена.
Вы также можете узнать, что некоторые из нестандартных символов, вызывающих проблему, - это Ñ и, возможно, É.
Ответы:
Юникод не равен UTF-8. Последнее - это просто кодировка для первого.
Вы делаете это неправильно. Вы читаете UTF-8 кодируются данные, так что вы должны декодировать в UTF-8 кодировке строки в строку Юникода.
Так что просто замените
.encode
на.decode
, и он должен работать (если ваш .csv закодирован в UTF-8).Но стыдиться нечего. Бьюсь об заклад, 3 из 5 программистов сначала не понимали этого, если не больше;)
Обновление: если ваши входные данные не закодированы в UTF-8, то
.decode()
, конечно , вам необходимо использовать соответствующую кодировку. Если ничего не указано, python принимает ASCII, что явно не работает с не-ASCII-символами.источник
.decode('utf-8')
должно сработать , ни?Просто добавьте эти строки в свои коды:
источник
для пользователей Python 3. ты можешь сделать
с колбой тоже работает :)
источник
Основная причина ошибки заключается в том, что кодировка по умолчанию, принятая python, - ASCII. Следовательно, если строковые данные, которые должны быть закодированы,
encode('utf8')
содержат символ, который находится за пределами диапазона ASCII, например, для строки типа 'hgvcj 터 파크 387', python выдаст ошибку, потому что строка не в ожидаемом формате кодирования.Если вы используете версию python более раннюю, чем версия 3.5, надежным исправлением будет установка кодировки по умолчанию, принятой python, на
utf8
:Таким образом, python сможет предвидеть символы в строке, выходящие за пределы диапазона ASCII.
Однако, если вы используете python версии 3.5 или выше, функция reload () недоступна, поэтому вам придется исправить ее, используя декодирование, например
источник
Для пользователей Python 3:
изменение кодировки с ascii на latin1 работает.
Кроме того, вы можете попробовать найти кодировку автоматически, прочитав верхние 10000 байт, используя следующий фрагмент:
источник
На моем компьютере был установлен неправильный языковой стандарт.
Я сначала сделал
locale.getpreferredencoding(False)
- это функция, вызываемая,open()
когда вы не предоставляете кодировку . Вывод должен быть'UTF-8'
, но в данном случае это какой-то вариант ASCII .Затем я запустил команду bash
locale
и получил этот результатИтак, я использовал локаль Ubuntu по умолчанию, которая заставляет Python открывать файлы как ASCII вместо UTF-8. Мне пришлось установить локаль на
en_US.UTF-8
Если вы не можете изменить всю систему языковых стандартов, вы можете вызвать весь свой код Python следующим образом:
или делать
чтобы установить его в оболочке, в которой вы его запускаете.
источник
если у вас возникла эта проблема при запуске certbot при создании или обновлении сертификата, используйте следующий метод
grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx
Эта команда нашла оскорбительный символ «´» в одном из файлов .conf в комментарии. После его удаления (вы можете редактировать комментарии по своему усмотрению) и перезагрузки nginx все снова заработало.
Источник: https://github.com/certbot/certbot/issues/5236
источник
Или, когда вы работаете с текстом в Python, если это текст Unicode, обратите внимание, что это Unicode.
Установите
text=u'unicode text'
вместо этого простоtext='unicode text'
.В моем случае это сработало.
источник
открыть с кодировкой UTF 16 из-за lat и long.
источник
Он действительно работает, просто беря аргумент 'rb' для чтения двоичного файла вместо чтения 'r'
источник