【问题标题】:Piping latin-1 encoded output of a program to a Python 3 script将程序的 latin-1 编码输出管道传输到 Python 3 脚本
【发布时间】:2011-03-15 00:34:28
【问题描述】:

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

通过管道传输到脚本的程序输出以 latin-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.encodingUTF-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

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

【问题讨论】:

    标签: python python-3.x stdin


    【解决方案1】:
    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】:

    查看文档中的此链接:sys.stdin。相关部分是:

    标准流默认处于文本模式。要向它们写入或读取二进制数据,请使用底层二进制缓冲区。例如,要将字节写入标准输出,请使用 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()
    

    完成此操作后,您可以将二进制输入编码为您想要的任何编码。


    另见这篇文章: How to set sys.stdout encoding in Python 3?
    该帖子的建议是使用:

    sys.stdin = codecs.getreader("utf-8")(sys.stdin.detach())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2012-09-06
      • 1970-01-01
      相关资源
      最近更新 更多