Я читаю в файле с модулем 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? Как я могу сказать?
Попробуйте использовать "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£
>>>
Если вы работаете в Windows, весьма вероятно, что кодировка, которую вы должны использовать, относится к семейству cp125X ... например, если вы находитесь в Западной Европе или Америке, это будет cp1252
. Программное обеспечение Windows часто использует байты в диапазоне от \ x80
до \ x9F
включительно для кодирования необычных знаков пунктуации, тогда как этот диапазон зарезервирован в ISO-8859-X для редко используемых управляющих символов C1. ".
Вы можете узнать обычную кодировку в вашем регионе, запустив это в командной строке:
python -c "import locale; print locale.getpreferredencoding()"