我正在从一个以秒为秒的节奏提供行的命名管道中逐行读取。我正在尝试简单的
for line in file:
processLine(line)
但是 processLine()
从未被调用。 (编辑:它最终在读取了很多行之后被调用,这需要几分钟。)使用 strace
进行调查表明该过程确实正在执行完成 read()
系统每秒调用一次,并且每次都按预期接收完整的一行。
我可以猜测 for line in
习惯用法会缓冲输入,并在稍后对每个输入行调用 processLine()
,可能是在缓冲区已满或以防输入终止(在我的情况下它永远不会)。
我可以将此处使用的缓冲区显式设置为较小的值吗?
或者是否有另一种方法来调整事情,使每一行也以秒为单位的节奏处理?
编辑:
目前我正在使用这个解决方法:
for line in lineByLine(namedPipe):
…
这是lineByLine()
:
def lineByLine(openFile):
line = ''
while True:
char = os.read(openFile.fileno(), 1)
if not char:
if line:
yield line
break
line += char
if line.endswith('\n'):
yield line
line = ''
但这种丑陋的解决方法当然不是解决方案。
最佳答案
正如您在问题中提到的,file.next()
内部缓冲器。通常这种行为是正确的并且无法检测到。
file.readline()
不会以相同的方式进行内部缓冲。您笨拙的示例程序创建了一个生成器,它允许 file.readline()
用作 for
循环中的可迭代对象。
创建此类可迭代对象的更简单方法是使用双参数形式 iter
:
import sys
for line in iter(namedPipe.readline, ''):
print line
关于python - 避免缓冲读取 "for line in ...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863494/