我想要几个Python脚本来修改文本文件。例如,“do1”接受来自 stdin 或文件的输入,并将输出发送到 stdout 或文件:
#!/usr/bin/env python3
import sys
import select
fi = sys.stdin if select.select([ sys.stdin, ], [], [], 0.0 )[ 0 ] else None
ofname = None
for arg in sys.argv[ 1 : ]:
if fi is None: fi = open( arg )
elif ofname is None: ofname = arg
if fi is None:
print( '1 no stdin or input file' ) # 2 for do2
exit( 1 )
if ofname is None:
fo = sys.stdout
else:
fo = open( ofname, 'w' )
for l in fi:
fo.write( '1' ) # 2 for do2
fo.write( l )
第二个脚本 do2 是相同的,但如注释中所示为“2 for 1”。当运行这个(在 unix 上)时,我得到了各种结果:
$ echo hi | ./do1 | ./do2
2 no stdin or input file
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
或
$ echo hi | ./do1 | ./do2
2 no stdin or input file
或
$ echo hi | ./do1 | ./do2
21hi
这是怎么回事?我认为这是某种计时问题,前一个管道在下一个程序可以读取它之前就消失了,但我不知道如何进展。
我不确定它们是否是真正的原因,但我怀疑有两个潜在的麻烦来源
open
编辑您的文件,但永远不要close
它们,在python
中,您应该使用with open
...(它将自动为您关闭文件)或close
自己归档open
中设置,但假设“交互式”文本文件(isatty()返回True的文件)使用行缓冲。其中行缓冲意味着python
会推迟写入,直到找到行结尾,您如果你想更早地进行写入,则需要刷新