Я знаю, что на Stack Overflow уже есть сотни вопросов о Python Unicode. Я прочитал много из них, но не могу найти ответа на свой ...
Я пытаюсь прочитать файл CSV latin-1. Он включает знак фунта стерлингов (символ \ xa3 в латинском-1), поэтому я установил encoding = "latin-1", но Python, похоже, игнорирует кодировку. Этот:
with open(filename, newline='', encoding = "latin-1") as csvfile:
data = csv.reader(csvfile, delimiter=',', quotechar='\"')
for row in data:
print(row)
Производит:
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 202: ordinal not in range(128)
Я сократил исходный файл CSV до одной строки, которая вызывает проблему. Это вызвано знаком £.
Единственные решения, которые я нашел, - это использовать errors = "ignore", который просто скрывает проблему, или errors = "surrogateescape", который просто создает проблему с экранированными символами дальше по строке.
Я знаю, что кодировка файла latin-1, хотя я также пробовал utf-8 и iso-8859-1.
Python может с радостью напечатать знак £:
>>> print('£')
> £
>>> print(u'\xa3')
£
Любые ответы / советы / предложения приветствуются. Заранее спасибо.
=== ОБНОВЛЕНИЕ ===
Это не вызывает ошибки:
with open(file, newline='', encoding = "latin-1") as csvfile:
data = csv.reader(csvfile, delimiter=',', quotechar='\"')
for row in data:
print("do nothing with the data")
Я подозреваю, что проблема не в чтении, а в том, когда вы выводите строку на экран.
Думаю, вы правы ... см. Обновление выше. Я думал, что пробовал это раньше с тем же результатом, но если я сделаю это сейчас, это не вызовет проблемы. Так что, возможно, у меня будет совсем другой вопрос, который я хочу задать позже! Можете поделиться здесь быстрым ответом, пожалуйста? Я могу сделать репост позже, если понадобится новый вопрос. Спасибо.
И да, ошибка в print (row) трассировки стека. Спасибо.
Как ни странно, ваша интерактивная консоль работает нормально. Как вы вызываете свой скрипт, содержащий прочитанный CSV?
Превосходный текст на Mac. Интерактивная консоль - это расширение REPL для редактора. Когда вернусь домой, попробую из командной строки. Интересно, что locale.getpreferredencoding () возвращает US ASCII, что кажется странным для Mac в Великобритании / Европе. Когда я вернусь к своему компьютеру, я попробую за пределами Sublime Text.





Мне удалось воспроизвести проблему, установив языковой стандарт на C, что означает, что набор символов ограничен ASCII:
$ LC_CTYPE=C python3 foo.py
Traceback (most recent call last):
File "foo.py", line 7, in <module>
print(row)
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 7: ordinal not in range(128)
Строка 7 - это строка вызова print, поэтому эта проблема появляется на выходе, а не на входе.
С локалью UTF-8 это работает:
$ LC_CTYPE=en_GB.UTF-8 python3 foo.py
['1', '£']
['2', 'a']
Вы можете проверить языковой стандарт по умолчанию с помощью команды locale:
$ locale
LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
LC_CTYPE = "en_GB.UTF-8"
LC_NUMERIC = "en_GB.UTF-8"
LC_TIME = "en_GB.UTF-8"
LC_COLLATE = "en_GB.UTF-8"
LC_MONETARY = "en_GB.UTF-8"
LC_MESSAGES = "en_GB.UTF-8"
LC_PAPER = "en_GB.UTF-8"
LC_NAME = "en_GB.UTF-8"
LC_ADDRESS = "en_GB.UTF-8"
LC_TELEPHONE = "en_GB.UTF-8"
LC_MEASUREMENT = "en_GB.UTF-8"
LC_IDENTIFICATION = "en_GB.UTF-8"
LC_ALL=
Ответ далек от того, что я ожидал, когда разместил вопрос. Это не имеет отношения к Python. Это редактор.
Я запускаю код из редактора Sublime Text 3 на Mac. Оказывается, когда вы это делаете, интерпретатор не получает никакой информации о локали, если вы явно не передадите ее.
Теперь я обнаружил, что мой вопрос дублирует этот:
Печать UTF8 в Python 3 с использованием Sublime Text
Приведенные выше комментарии и ответы помогли мне найти этот другой вопрос и найти ответ. Так:
Если Аластер МакКормак или Легосиа захотят опубликовать вышеизложенное в качестве ответа, я буду счастлив принять его, чтобы поблагодарить вас за вашу помощь. Если вы этого не сделаете, я приму свой ответ, чтобы его увидели другие.
Или, если кто-то, читающий это, хочет отметить мой вопрос как дубликат того, который я указал выше, пожалуйста, продолжайте. Спасибо вам всем.
Можете ли вы предоставить трассировку стека с вашей ошибкой?