如何用Python编写Unix过滤器?

15 投票
4 回答
5899 浏览
提问于 2025-04-15 15:11

我想写一个程序,它可以读取标准输入(不带缓存),然后把处理后的内容写到标准输出(也不带缓存)。为了举个例子,假设我想把所有的字符 x 从标准输入中去掉。

4 个回答

15

sys.stdin 读取数据,然后写入 sys.stdout(或者直接用 print)。你的示例程序如下:

import sys

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

其实没有一种标准的方法可以让输入(stdin)变成无缓冲的,而且你也不需要这样做。让操作系统来处理缓冲就可以了。

16

你可以使用 fileinput,它可以像 Perl 的钻石操作符那样处理输入。文档中提到:

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

这里的处理方式类似于 print line.replace('x','')

你可以查看 这个 StackOverflow 问题,了解如何让标准输出不被缓存。或者,你也可以在每次 print 之后调用 sys.stdout.flush() 来实现。

6

我不太清楚你在这个上下文中说的“缓冲”具体指什么,但你问的事情其实很简单...

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 来看看它是怎么工作的。

撰写回答