3

从这个背景来看:

import itertools
lines = itertools.cycle(open('filename'))

我想知道如何实现相同的“功能”,但在文件到达末尾时重新读取文件,因此如果文件在第一次迭代后发生更改,则会在开始另一个循环之前重新加载。(希望我已经解释得很好)

先感谢您!:)

4

2 回答 2

4

我会使用:

itertools.chain.from_iterable(itertools.starmap(open, itertools.repeat(("filename",))))

或者:

itertools.chain.from_iterable(itertools.starmap(lambda: open("filename"), itertools.repeat(())))

你也可以写一个生成器理解(我想我最喜欢这个!):

(line for _ in itertools.repeat(()) for line in open("filename"))

这是命令式(基于语句)等价物:

def cycle_file(filename):
    while True:
        for line in open(filename):
            yield line

或者,使用 Python 3.3(使用PEP 380子生成器委托):

def cycle_file(filename):
    while True:
        yield from open(filename)

所有这些的一个问题是(在 GC 平台上,例如 Jython)在文件对象被 GC 之前不会关闭文件,这可能会在一段时间后发生。为了防止打开的文件泄漏,您必须调用close它或使用上下文管理器(with语句)。这很自然地以命令式形式出现:

def cycle_file(filename):
    while True:
        with open(filename) as f:
            for line in f:
                yield line

或者

def cycle_file(filename):
    while True:
        with open(filename) as f:
            yield from f

试图用生成器理解关闭文件变得非常做作:

(line for f in (itertools.chain(f, (f for f in (f,) if f.close() and False))
                for f in (open("filename") for _ in itertools.repeat(())))
 for line in f)

如果 Python 有办法指定opened 文件在到达文件末尾时自行关闭,或者告诉上下文管理器迭代器在StopIteration.

于 2012-07-04T15:59:10.193 回答
2

就像是

def cycle_file(f):
    while True:
        ln = f.readline()
        if ln == "":
            f.seek(0)
            continue
        yield ln

除了检查空文件可能会很好,我将把它留给你。

于 2012-07-04T15:51:28.427 回答