Передача выходных данных программы, закодированных в латинице 1, в сценарий Python 3 - PullRequest
3 голосов
/ 15 марта 2011

Я хочу построчно обработать вывод работающей программы (например, tail -f) с помощью скрипта Python 3 (в Linux).

Вывод программы, который передается по конвейеруscript, кодируется в латинице-1, поэтому в Python 2 я использовал модуль codecs для правильного декодирования ввода sys.stdin:

#!/usr/bin/env python
import sys, codecs

sin = codecs.getreader('latin-1')(sys.stdin)
for line in sin:
    print '%s "%s"' % (type (line), line.encode('ascii','xmlcharrefreplace').strip())

Это сработало:

<type 'unicode'> "Hi! &#246;&#228;&#223;"
...

Однако в Python 3 sys.stdin.encoding равен UTF-8, и если я просто наивно читаю со стандартного ввода:

#!/usr/bin/env python3
import sys

for line in sys.stdin:
    print ('type:{0} line:{1}'.format(type (line), line))

, я получаю эту ошибку:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xf6 in position 4: invalid start byte

Как я могу прочитать текстовые данные не в формате UTF-8, переданные в stdin в Python 3?

Ответы [ 2 ]

3 голосов
/ 15 марта 2011
import sys
import io

with io.open(sys.stdin.fileno(),'r',encoding='latin-1') as sin:
    for line in sin:
        print ('type:{0} line:{1}'.format(type (line), line))

урожайность

type:<class 'str'> line:Hi! öäß
2 голосов
/ 15 марта 2011

Взгляните на эту ссылку в документации: sys.stdin .Соответствующая часть:

Стандартные потоки по умолчанию находятся в текстовом режиме.Чтобы записать или прочитать двоичные данные в них, используйте базовый двоичный буфер.Например, чтобы записать байты в stdout, используйте sys.stdout.buffer.write (b'abc ').Использование потоков io.TextIOBase.detach () может быть сделано двоичным по умолчанию.Эта функция устанавливает stdin и stdout в двоичное значение:

def make_streams_binary():  
    sys.stdin = sys.stdin.detach()  
    sys.stdout = sys.stdout.detach()

После этого вы можете кодировать двоичный вход в любую кодировку, какую захотите.

Также смотрите этот пост: Как установить кодировку sys.stdout в Python 3?
Предложение из этого поста было использовать:

sys.stdin = codecs.getreader("utf-8")(sys.stdin.detach())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...