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)
问题是(我认为)当您调用 next
时 iglob
被计算。有办法避免吗?
我的问题如下:我的 Python 脚本正在文件夹中搜索文件,使用 glob
递归 (recursive=True'
)。关键是我有很多文件,因为我正在一个一个地处理,所以不需要同时存储所有文件名,所以我想使用生成器。关键是我的程序所做的是移动子目录中的文件,所以我担心 iglob
可能会在我移动后两次找到相同的文件。
你不能强迫iglob()
提前阅读目录列表,不。这就是发电机的工作原理;在您实际迭代之前,他们不会开始任何工作。因此,glob()
和 iglob()
只有 return 相同的结果 前提是文件系统在迭代完成之前没有改变。
大多数情况下,iglob()
过滤 懒惰;对于简单的无路径、非递归情况,os.listdir()
会在您开始迭代时立即调用,并且迭代仅涉及过滤这些名称。
对于递归模式(使用**
)或路径名中使用的模式,iglob()
延迟加载子目录的目录列表;没有模式的最顶层目录仍然会立即加载,因此如果子目录在迭代时发生变化,您也会得到不一致的结果。
如果您需要在特定时间捕获文件系统的状态,请不要使用 iglob()
。在这种情况下使用 glob()
,并在 Python 列表中使用 'freeze'。
文档说:
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)
问题是(我认为)当您调用 next
时 iglob
被计算。有办法避免吗?
我的问题如下:我的 Python 脚本正在文件夹中搜索文件,使用 glob
递归 (recursive=True'
)。关键是我有很多文件,因为我正在一个一个地处理,所以不需要同时存储所有文件名,所以我想使用生成器。关键是我的程序所做的是移动子目录中的文件,所以我担心 iglob
可能会在我移动后两次找到相同的文件。
你不能强迫iglob()
提前阅读目录列表,不。这就是发电机的工作原理;在您实际迭代之前,他们不会开始任何工作。因此,glob()
和 iglob()
只有 return 相同的结果 前提是文件系统在迭代完成之前没有改变。
大多数情况下,iglob()
过滤 懒惰;对于简单的无路径、非递归情况,os.listdir()
会在您开始迭代时立即调用,并且迭代仅涉及过滤这些名称。
对于递归模式(使用**
)或路径名中使用的模式,iglob()
延迟加载子目录的目录列表;没有模式的最顶层目录仍然会立即加载,因此如果子目录在迭代时发生变化,您也会得到不一致的结果。
如果您需要在特定时间捕获文件系统的状态,请不要使用 iglob()
。在这种情况下使用 glob()
,并在 Python 列表中使用 'freeze'。