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



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



Я открываю 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. Я прочитал несколько сообщений на эту тему, но ни один из них, похоже, не применяется напрямую. Любая помощь будет очень признательна.



вы также можете знать, что некоторые из нестандартных символов, вызывающих проблему, являются-и, возможно, É.

580   5  

5 ответов:

Unicode не равен UTF-8. Последнее-это просто кодирование для бывшего.

Вы делаете это неправильно. Ты -чтение UTF-8 -закодированных данные, так что вы должны расшифруйте строка в кодировке UTF-8 в строку unicode.

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

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

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

просто добавьте следующие строки в ваш код :

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

для пользователей Python 3. вы можете сделать

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

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

основная причина ошибки заключается в том, что кодировка по умолчанию, принятая python, является ASCII. Следовательно, если строковые данные должны быть закодированы с помощью encode('utf8') содержит символ, который находится вне диапазона ASCII, например, для строки типа 'hgvcj터파크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')

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

меняем кодировку от 'в кодировке ASCII' в 'работах латинских типа 1'.

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

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

Comments

    Ничего не найдено.