python – 避免缓冲读取“for line in …”

我正在从一个命名管道逐行阅读,该管道以逐秒的节奏提供线条.我试着简单明了

for line in file:
    processLine(line)

但是从不调用processLine(). (编辑:在读取了很多行之后最终会调用它,这需要几分钟.)使用strace进行调查显示,该进程确实每秒执行一次read()系统调用,并且正如预期的那样每个都接收一个完整的行时间.

我可以猜测成语中的for行缓冲输入,并且稍后会在每个输入行调用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循环中的iterable.

创建这样的可迭代的更简单方法是使用iter的双参数形式:

import sys
for line  in iter(namedPipe.readline, ''):
  print line
点赞