Python 3, похоже, игнорирует настройку кодировки для файла CSV при построении в Sublime Text

Я знаю, что на 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")

Можете ли вы предоставить трассировку стека с вашей ошибкой?

Alastair McCormack 07.11.2018 11:41

Я подозреваю, что проблема не в чтении, а в том, когда вы выводите строку на экран.

Alastair McCormack 07.11.2018 11:43

Думаю, вы правы ... см. Обновление выше. Я думал, что пробовал это раньше с тем же результатом, но если я сделаю это сейчас, это не вызовет проблемы. Так что, возможно, у меня будет совсем другой вопрос, который я хочу задать позже! Можете поделиться здесь быстрым ответом, пожалуйста? Я могу сделать репост позже, если понадобится новый вопрос. Спасибо.

James 07.11.2018 11:44

И да, ошибка в print (row) трассировки стека. Спасибо.

James 07.11.2018 11:48

Как ни странно, ваша интерактивная консоль работает нормально. Как вы вызываете свой скрипт, содержащий прочитанный CSV?

Alastair McCormack 07.11.2018 11:51

Превосходный текст на Mac. Интерактивная консоль - это расширение REPL для редактора. Когда вернусь домой, попробую из командной строки. Интересно, что locale.getpreferredencoding () возвращает US ASCII, что кажется странным для Mac в Великобритании / Европе. Когда я вернусь к своему компьютеру, я попробую за пределами Sublime Text.

James 07.11.2018 12:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
457
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мне удалось воспроизвести проблему, установив языковой стандарт на 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

Приведенные выше комментарии и ответы помогли мне найти этот другой вопрос и найти ответ. Так:

Если Аластер МакКормак или Легосиа захотят опубликовать вышеизложенное в качестве ответа, я буду счастлив принять его, чтобы поблагодарить вас за вашу помощь. Если вы этого не сделаете, я приму свой ответ, чтобы его увидели другие.

Или, если кто-то, читающий это, хочет отметить мой вопрос как дубликат того, который я указал выше, пожалуйста, продолжайте. Спасибо вам всем.

Другие вопросы по теме