我想用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! öäß"
...
但是,在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! öäß