Python CSV: UnicodeDecodeError

Я читаю в файле с модулем Python csv и у меня есть еще один вопрос о кодировке (извините, здесь так много).

В файле CSV есть знаки £. После прочтения строки и ее печати они стали \ xa3.

Попытка кодировать их как Unicode приводит к UnicodeDecodeError :

row = [unicode(x.strip()) for x in row]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 0: ordinal not in range(128)

Я читал документацию csv и многочисленные другие вопросы по этому поводу в StackOverflow. Я думаю , что £ становление \ xa3 в ASCII означает, что исходный файл CSV находится в UTF-8.

(Кстати, есть ли быстрый способ проверить кодировку файла CSV?)

Если он находится в UTF-8, тогда не должен ли модуль csv справиться с этим? Кажется, что он преобразует все символы в ASCII, хотя в документации утверждается, что он принимает UTF-8.

Я попытался добавить функцию unicode_csv_reader , как описано в примерах csv , но это не помогает.

---- РЕДАКТИРОВАТЬ -----

Я должен уточнить одну вещь. Я видел этот вопрос , который выглядит очень похоже. Но добавление определенной здесь функции unicode_csv_reader приводит к другой ошибке:

yield [unicode(cell, 'utf-8') for cell in row]
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa3 in position 8: unexpected code byte

Так, может, мой файл в конце концов не UTF8? Как я могу сказать?

10
задан Community 23 May 2017 в 12:09
поделиться

2 ответа

Попробуйте использовать "ISO-8859-1" для вашей кодировки. Похоже, вы имеете дело с расширенным ASCII, а не с Unicode.

Изменить:

Вот простой код, который имеет дело с расширенным ASCII:

>>> s = "La Pe\xf1a"
>>> print s
La Pe±a
>>> print s.decode("latin-1")
La Peña
>>>

Еще лучше, имея дело с точным символом, который вызывает проблемы:

>>> s = "12\xa3"
>>> print s.decode("latin-1")
12£
>>>
7
ответ дан 4 December 2019 в 02:49
поделиться

Если вы работаете в Windows, весьма вероятно, что кодировка, которую вы должны использовать, относится к семейству cp125X ... например, если вы находитесь в Западной Европе или Америке, это будет cp1252 . Программное обеспечение Windows часто использует байты в диапазоне от \ x80 до \ x9F включительно для кодирования необычных знаков пунктуации, тогда как этот диапазон зарезервирован в ISO-8859-X для редко используемых управляющих символов C1. ".

Вы можете узнать обычную кодировку в вашем регионе, запустив это в командной строке:

python -c "import locale; print locale.getpreferredencoding()"
0
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

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