【问题标题】:delays in reading stdin with codecs使用编解码器读取标准输入的延迟
【发布时间】:2013-06-18 14:58:09
【问题描述】:

我正在尝试使用下面的代码使用编解码器简单地从标准输入读取

import codecs

ins = codecs.getreader('utf-8')(sys.stdin, 'replace')
for l in ins:
    print l

我有另一个脚本在小数据突发中写入标准输出。我需要我的脚本在每次突发后处理数据。但是,编解码器似乎可以缓冲数据。这意味着写入标准输出的行不会立即出现在我上面的阅读器代码中。是否可以设置一个参数来防止缓冲?

谢谢!

【问题讨论】:

    标签: python stdin codec


    【解决方案1】:

    在这个看似简单的示例中有两个级别的缓冲。 为了避免第一级——更多的是作为一种解决方法而不是解决方案——你可以阅读每一行然后对其进行解码,而不是反过来。它之所以有效,是因为在 utf-8 中行尾仍然是明确的 \n 。 (注意:第一段代码不起作用,因为它仍然具有第二级缓冲!包含它是为了解释)

    for l in sys.stdin:
        l = l.decode('utf-8', 'replace')
        print l
    

    第二层来自for l in file。所以你实际上需要:

    while True:
        l = sys.stdin.readline()
        if not l: break
        l = l.decode('utf-8', 'replace')
        print l
    

    【讨论】:

    • 感谢您的帮助!第二个例子奏效了。我只添加了strip() 来读取输入,以删除引入的额外空白行。或者,我可以使用sys.stdout.write() 而不是print()。顺便说一句,我没有得到第一个例子。自从我的问题得到解决后,我还没有深入研究它。
    • 在我的回答中添加了 注释。
    • 由于某种原因,我似乎找不到任何关于 for l in sys.stdin 中发生的缓冲的文档。你碰巧有这方面的参考吗?
    • stackoverflow.com/questions/5076024/… 至少给出了一些指示。我不知道它是否被记录在案。
    猜你喜欢
    • 2018-05-05
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多