用latin-1编码的程序输出到Python 3脚本

我想用Python 3脚本(在Linux上)逐行处理正在运行的程序的输出(想想tail -f).

程序输出(通过管道传递到脚本)以latin-1编码,因此,在Python 2中,我使用了编解码器模块正确解码了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,如果我只是从stdin中天真地阅读的话:

#!/usr/bin/env python3
import sys

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

我收到此错误:

UnicodeDecodeError:“ utf8”编解码器无法解码位置4的字节0xf6:无效的起始字节

如何在Python 3中读取通过管道传递到stdin的非UTF-8文本数据?

解决方法:

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! öäß
上一篇:java-从stdin读取多字字符串


下一篇:非交互状态下修改用户密码