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.

  • Python DictWriter записывает CSV-файлы с кодировкой UTF-8
  • Strange `UnicodeEncodeError`, используя` os.path.exists`
  • Должен ли я использовать строку Unicode по умолчанию?
  • Почему `` ↊'.numeric () `false?
  • Как получить строковые объекты вместо Unicode от JSON?
  • Как найти текстовое описание смайликов, символов Unicode и emoji в строке (python, perl)?
  • Преобразование объекта unicode в латинскую строку с объектами
  • Скребок HTML с использованием lxml и запросов дает ошибку в unicode
  • Python - лучший язык программирования в мире.