Python CSV: UnicodeDecodeError - PullRequest
       3

Python CSV: UnicodeDecodeError

10 голосов
/ 13 августа 2010

Я читаю в файле с модулем 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.Я думаю, что означает, что, став ASCII \ xa3, означает, что исходный файл 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?Как я могу сказать?

Ответы [ 2 ]

7 голосов
/ 13 августа 2010

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

Edit:

Вот простой код, который имеет дело с расширенным 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£
>>>
0 голосов
/ 14 августа 2010

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

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

python -c "import locale; print locale.getpreferredencoding()"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...