python for line in open,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

标签:python,file,for-loop,buffer

来源: https://codeday.me/bug/20190703/1363834.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值