Вопрос по python – UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xd1 в позиции 2: порядковый номер не в диапазоне (128)

84

Я пытаюсь работать с очень большим набором данных, в котором есть несколько нестандартных символов. Мне нужно использовать Unicode, в соответствии со спецификациями работы, но я сбит с толку. (И вполне возможно, делать все это неправильно.)

Я открываю CSV, используя:

<code> 15     ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')
</code>

Затем я пытаюсь закодировать его:

<code>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])
</code>

Я кодирую все, кроме lat и lng, потому что они должны быть отправлены в API. Когда я запускаю программу для анализа набора данных в том, что я могу использовать, я получаю следующую трассировку.

<code>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)
</code>

Я думаю, что должен сказать вам, что я использую python 2.7.2, и это часть сборки приложения на django 1.4. Я прочитал несколько сообщений на эту тему, но ни один из них, похоже, не имеет прямого отношения. Любая помощь будет оценена.

Возможно, вы также захотите узнать, что некоторые нестандартные символы, вызывающие проблему, являются & # xD1; и, возможно, & # xC9 ;.

возможный дубликатEncoding gives "'ascii' codec can't encode character … ordinal not in range(128)" [Ред .: и я уверен, что из примерно миллиона других]. Karl Knechtel
Какая у вас оригинальная кодировка файлов? Я думаю, что вы должны декодировать его в соответствии с оригинальной кодировкой, а затем преобразовать в UTF 8 xiao 啸

Ваш Ответ

5   ответов
10

with open(csv_name_here, 'r', encoding="utf-8") as f:
    #some codes

это работает с колбой тоже :)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
5

Основная причина ошибки состоит в том, что кодировка по умолчанию, принятая python, является ASCII. Следовательно, если строковые данные должны быть закодированыencode('utf8') содержит символ, который находится вне диапазона ASCII, например для строки, подобной 'hgvcj & # xD130; & # xD30C; & # xD06C; 387', python выдает ошибку, поскольку строка не соответствует ожидаемому формату кодирования.

Если вы используете версию Python, более раннюю, чем версия 3.5, надежным решением было бы установить кодировку по умолчанию, принятую python наutf8:

import sys
reload(sys)
sys.setdefaultencoding('utf8')
name = school_name.encode('utf8')

Таким образом, python сможет предвидеть символы в строке, которые выходят за пределы диапазона ASCII.

Однако, если вы используете Python версии 3.5 или выше, функция reload () недоступна, поэтому вам придется исправить это с помощью decode, например.

name = school_name.decode('utf8').encode('utf8')
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
130

Unicode не равен UTF-8. Последний простоencoding для первого.

Вы делаете это неправильно. Выreading UTF-8encoded данные, так что вы должныdecode строка в кодировке UTF-8 в строку Unicode.

Так что просто замени.encode с.decode, и это должно работать (если ваш .csv имеет кодировку UTF-8).

Хотя нечего стыдиться. Бьюсь об заклад, у 3 из 5 программистов возникли проблемы с первым пониманием этого, если не больше;)

Обновить: Если ваши входные данныеnot В кодировке UTF-8, то надо.decode() с соответствующей кодировкой, конечно. Если ничего не указано, python принимает ASCII, что явно не для символов, не являющихся ASCII.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded'ascii' codec can't encode character u'\xf1' in position 2: ordinal not in range(128)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded jelkimantis
Error: User Rate Limit ExceededencodedError: User Rate Limit Exceeded.decode('utf-8')Error: User Rate Limit Exceeded
0

Для пользователей Python 3:

изменяя кодировку с «ascii»; на «латинский 1»; работает.

Кроме того, вы можете попробовать найти кодировку автоматически, прочитав верхние 10000 байт, используя следующий фрагмент:

import chardet  
with open("dataset_path", 'rb') as rawdata:  
            result = chardet.detect(rawdata.read(10000))  
print(result)
71

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы