3

考虑以下python脚本

#test.py
import sys
inputfile=sys.argv[1]
with open(inputfile,'r') as f:
    for line in f.readlines():
        print line

with open(inputfile,'r') as f:
    for line in f.readlines():
        print line

现在我想test.py在一个替代进程上运行,例如,

python test.py <( cat file | head -10)

似乎第二个f.readlines返回空。为什么会这样,有没有办法在不必指定两个输入文件的情况下做到这一点?

4

2 回答 2

4
  • 这是为什么。
    • 进程替换通过创建命名管道来工作。所以在第一个打开/读取循环中消耗的所有数据。
  • 有没有办法做到这一点而不必指定两个输入文件。
    • 在使用数据之前如何缓冲数据。

这是一个示例代码

import sys
import StringIO
inputfile=sys.argv[1]

buffer = StringIO.StringIO()

# buffering
with open(inputfile, 'r') as f:
    buffer.write(f.read())

# use it 
buffer.seek(0)
for line in buffer:
    print line

# use it again
buffer.seek(0)
for line in buffer:
    print line
于 2014-04-01T06:02:10.613 回答
1

readlines()将立即从输入中读取所有可用行。这就是为什么第二次调用什么都不返回的原因,因为没有什么可读取的了。您可以将结果分配给readlines()局部变量并根据需要多次使用它:

import sys
inputfile=sys.argv[1]
with open(inputfile,'r') as f:
    lines = f.readlines()
    for line in lines:
        print line

    #use it again
    for line in lines:
        print line
于 2014-04-01T07:00:05.047 回答