如何用Python编写Unix过滤器?
我想写一个程序,它可以读取标准输入(不带缓存),然后把处理后的内容写到标准输出(也不带缓存)。为了举个例子,假设我想把所有的字符 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
来看看它是怎么工作的。