从这个背景来看:
import itertools
lines = itertools.cycle(open('filename'))
我想知道如何实现相同的“功能”,但在文件到达末尾时重新读取文件,因此如果文件在第一次迭代后发生更改,则会在开始另一个循环之前重新加载。(希望我已经解释得很好)
先感谢您!:)
从这个背景来看:
import itertools
lines = itertools.cycle(open('filename'))
我想知道如何实现相同的“功能”,但在文件到达末尾时重新读取文件,因此如果文件在第一次迭代后发生更改,则会在开始另一个循环之前重新加载。(希望我已经解释得很好)
先感谢您!:)
我会使用:
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 有办法指定open
ed 文件在到达文件末尾时自行关闭,或者告诉上下文管理器迭代器在StopIteration
.
就像是
def cycle_file(f):
while True:
ln = f.readline()
if ln == "":
f.seek(0)
continue
yield ln
除了检查空文件可能会很好,我将把它留给你。