【问题标题】:How do I write a unix filter in python?如何在 python 中编写 unix 过滤器?
【发布时间】:2010-12-08 01:56:17
【问题描述】:

我想编写一个程序,它读取标准输入(无缓冲)并写入标准输出(无缓冲),进行一些琐碎的逐字符转换。为了这个例子,假设我想从标准输入中删除所有字符 x

【问题讨论】:

    标签: python unix filter


    【解决方案1】:

    sys.stdin 读取并写入sys.stdout(或使用print)。您的示例程序:

    import sys
    
    for line in sys.stdin:
        print line.replace("x", ""),
    

    没有一种标准方法可以使标准输入无缓冲,而且您不希望这样。让操作系统缓冲它。

    【讨论】:

    • 他确实说过“无缓冲”,但我不确定这是否真的重要。
    【解决方案2】:

    您可以使用fileinput class,它可以让您像 Perl 菱形运算符一样处理输入。来自文档:

    import fileinput
    for line in fileinput.input():
        process(line)
    

    进程在哪里执行print line.replace('x','') 之类的操作。

    您可以关注this StackOverflow question 了解如何取消缓冲标准输出。或者您可以在每个print 之后调用sys.stdout.flush()

    【讨论】:

    • 啊!这使得我所做的所有额外工作都变得如此简单,因为我错过了 Perl!我需要非常仔细地浏览 Python 标准库。
    • 这应该是公认的答案,fileinput 模块正是为此用例制作的。
    【解决方案3】:

    我不知道在这种情况下缓冲是什么意思,但是按照你的要求做是很简单的......

    so_gen.py(生成我们可以观看的恒定流):

    import time
    import sys
    while True:
        for char in 'abcdefx':
            sys.stdout.write(char)
            sys.stdout.flush()
            time.sleep(0.1)
    

    so_filter.py(按照你的要求做):

    import sys
    while True:
        char = sys.stdin.read(1)
        if not char:
            break
        if char != 'x':
            sys.stdout.write(char)
            sys.stdout.flush()
    

    尝试运行python so_gen.py | python so_filter.py 看看它的作用。

    【讨论】:

    • 写作获奖者if not char: break
    【解决方案4】:

    使用 python 解释器的 -u 开关使所有读取和写入都没有缓冲。类似于在 Perl 中设置 $| = true;。然后像你一样继续,阅读一行修改它,然后打印它。 sys.stdout.flush() 不需要。

    #!/path/to/python -u
    
    import sys
    
    for line in sys.stdin:
        process_line(line)
    

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2011-08-03
      • 2010-09-26
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2022-08-24
      • 1970-01-01
      相关资源
      最近更新 更多