python - 避免缓冲读取 "for line in ..."

标签 python file for-loop buffer

我正在从一个以秒为秒的节奏提供行的命名管道中逐行读取。我正在尝试简单的

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/

相关文章:

python - numpy 数组中行的前 n 个元素

python - 将 Flask 应用程序部署到 Heroku - 找不到模板

c - FILE 结构中未使用的变量

iphone - 迭代充满日期的 NSArray 并与另一个 NSArray 进行比较

Python 正确使用 __str__ 和 __repr__

python - Python中的继承,init方法重写

JavaScript For 循环问题 : Why Am I getting a syntax error?

java - 在 Java 的 for 循环中使用 Println 函数?

php - 确保所有文件具有唯一名称的正确方法?

Java 更新程序问题