阅读无限流 - 尾巴

时间:2017-07-04 00:56:23

标签: python python-3.x stream generator pipeline

  

问题:

     

程序从文件末尾开始从无限流中读取行。

#Solution:

import time
def tail(theFile):
    theFile.seek(0,2)   # Go to the end of the file
    while True:
        line = theFile.readline()
        if not line:
            time.sleep(10)    # Sleep briefly for 10sec
            continue
        yield line

if __name__ == '__main__':
    fd = open('./file', 'r+')
    for line in tail(fd):
        print(line)

readline()是非阻塞读取,if检查每一行。

问题:

在写入文件的进程有close()

后,我的程序运行无限等待是没有意义的

1)为了避免使用if

,该代码的EAFP方法是什么?

2)生成器函数可以返回file关闭吗?

1 个答案:

答案 0 :(得分:3)

@ChristianDean在comment非常好地回答了你的第一个问题,所以我会回答你的第二个问题。

我相信这是可能的 - 您可以使用theFile的{​​{1}}属性,并在文件关闭时引发closed异常。像这样:

StopIteration

当文件关闭并引发异常时,您的循环将停止。

更简洁的方法(谢谢,Christian Dean)不涉及显式异常,是测试循环标题中的文件指针。

def tail(theFile):
    theFile.seek(0, 2) 
    while True:
        if theFile.closed:
            raise StopIteration

        line = theFile.readline()
        ...
        yield line