iglob 什么时候评估?

When is iglob evaluated?

文档说:

Return an iterator which yields the same values as glob() without actually storing them all simultaneously.

实际上我不认为这是真的,特别是在程序执行期间创建文件的环境中。示例:

import glob
g = glob.iglob("*.py")
!touch a.py
!touch z.py
next(g)
next(g)

问题是(我认为)当您调用 nextiglob 被计算。有办法避免吗?

我的问题如下:我的 Python 脚本正在文件夹中搜索文件,使用 glob 递归 (recursive=True')。关键是我有很多文件,因为我正在一个一个地处理,所以不需要同时存储所有文件名,所以我想使用生成器。关键是我的程序所做的是移动子目录中的文件,所以我担心 iglob 可能会在我移动后两次找到相同的文件。

你不能强迫iglob()提前阅读目录列表,不。这就是发电机的工作原理;在您实际迭代之前,他们不会开始任何工作。因此,glob()iglob() 只有 return 相同的结果 前提是文件系统在迭代完成之前没有改变

大多数情况下,iglob() 过滤 懒惰;对于简单的无路径、非递归情况,os.listdir() 会在您开始迭代时立即调用,并且迭代仅涉及过滤这些名称。

对于递归模式(使用**)或路径名中使用的模式,iglob()延迟加载子目录的目录列表;没有模式的最顶层目录仍然会立即加载,因此如果子目录在迭代时发生变化,您也会得到不一致的结果。

如果您需要在特定时间捕获文件系统的状态,请不要使用 iglob()。在这种情况下使用 glob(),并在 Python 列表中使用 'freeze'。