Python 3: Как указать stdin-кодирование

При переносе кода с Python 2 на Python 3 я столкнулся с этой проблемой при чтении текста UTF-8 со стандартного ввода. В Python 2 это прекрасно работает:

for line in sys.stdin: ... 

Но Python 3 ожидает ASCII от sys.stdin , и если на входе есть символы, отличные от ASCII, я получаю ошибку:

UnicodeDecodeError: кодек ascii не может декодировать байт .. в позиции ..: порядковый номер не в диапазоне (128)

Для обычного файла я хотел бы указать кодировку при открытии файла:

 with open('filename', 'r', encoding='utf-8') as file: for line in file: ... 

Но как я могу указать кодировку для стандартного ввода? В других сообщениях СО предложено использовать

 input_stream = codecs.getreader('utf-8')(sys.stdin) for line in input_stream: ... 

Однако это не работает в Python 3. Я все равно получаю такое же сообщение об ошибке. Я использую Ubuntu 12.04.2, и моя локаль настроена на en_US.UTF-8.

One Solution collect form web for “Python 3: Как указать stdin-кодирование”

Python 3 не ожидает ASCII от sys.stdin . Он откроет stdin в текстовом режиме и сделает обоснованное предположение о том, какая кодировка используется. Это предположение может дойти до ASCII , но это не так. См. Документацию sys.stdin о том, как выбран кодек.

Как и другие файловые объекты, открытые в текстовом режиме, объект sys.stdin происходит из базового класса io.TextIOBase ; он имеет атрибут .buffer указывающий на базовый буферный экземпляр IO (который, в свою очередь, имеет атрибут .raw ).

Оберните атрибут sys.stdin.buffer в новом io.TextIOWrapper() чтобы указать другую кодировку:

 import io import sys input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') 

В качестве альтернативы, установите PYTHONIOENCODING среды PYTHONIOENCODING в желаемый кодек при запуске python.

  • Есть ли готовый jQuery-заменитель, который я могу использовать для urllib.quote и urllib.unquote в Python 2.6.5?
  • строка байта и строка unicode. питон
  • Персонаж \ u260e
  • Вывод кода Python и Unicode
  • Преобразование объектов Unicode с не-ASCII-символами в них в объекты строк (в Python)
  • Печать строки unicode в python независимо от среды
  • Python Удаление нелатинских символов
  • кодирование python utf-8
  • Как удалить акцент в Python 3.5 и получить строку с unicodedata или другими решениями?
  • Как символизировать слово малаялам?
  • Unicode re.sub () не работает с \ g <0> (группа 0)
  • Python - лучший язык программирования в мире.