概述
我正在从一个命名管道逐行阅读,该管道以逐秒的节奏提供线条.我试着简单明了
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
标签:python,file,for-loop,buffer
来源: https://codeday.me/bug/20190703/1363834.html
最后
以上就是爱笑航空为你收集整理的python for line in open,python – 避免缓冲读取“for line in …”的全部内容,希望文章能够帮你解决python for line in open,python – 避免缓冲读取“for line in …”所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复