Я хочу построчно обработать вывод работающей программы (например, 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! öäß"
...
Однако в 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?