【发布时间】:2010-12-08 01:56:17
【问题描述】:
我想编写一个程序,它读取标准输入(无缓冲)并写入标准输出(无缓冲),进行一些琐碎的逐字符转换。为了这个例子,假设我想从标准输入中删除所有字符 x。
【问题讨论】:
我想编写一个程序,它读取标准输入(无缓冲)并写入标准输出(无缓冲),进行一些琐碎的逐字符转换。为了这个例子,假设我想从标准输入中删除所有字符 x。
【问题讨论】:
从sys.stdin 读取并写入sys.stdout(或使用print)。您的示例程序:
import sys
for line in sys.stdin:
print line.replace("x", ""),
没有一种标准方法可以使标准输入无缓冲,而且您不希望这样。让操作系统缓冲它。
【讨论】:
您可以使用fileinput class,它可以让您像 Perl 菱形运算符一样处理输入。来自文档:
import fileinput
for line in fileinput.input():
process(line)
进程在哪里执行print line.replace('x','') 之类的操作。
您可以关注this StackOverflow question 了解如何取消缓冲标准输出。或者您可以在每个print 之后调用sys.stdout.flush()。
【讨论】:
fileinput 模块正是为此用例制作的。
我不知道在这种情况下缓冲是什么意思,但是按照你的要求做是很简单的......
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
使用 python 解释器的 -u 开关使所有读取和写入都没有缓冲。类似于在 Perl 中设置 $| = true;。然后像你一样继续,阅读一行修改它,然后打印它。 sys.stdout.flush() 不需要。
#!/path/to/python -u
import sys
for line in sys.stdin:
process_line(line)
【讨论】: