文档说:
返回一个迭代器,它产生与glob()相同的值,而不是实际同时存储它们。
实际上我认为不是这样,特别是在程序执行期间创建文件的环境中。例如:
<?php
$endshotc = count($shot);
for ($i=0; $i < $endshotc; $i++){
metadata=$xml->createElement("metadata");
$clip->appendChild($metadata);
$name=$xml->createElement("name","shotL".$i);
$metadata->appendChild($name);
$value=$xml->createElement("value",$shotx[$i]);
$metadata->appendChild($value);
}
?>
问题是(我认为)在您致电import glob
g = glob.iglob("*.py")
!touch a.py
!touch z.py
next(g)
next(g)
时会评估iglob
。有没有办法避免它?
我的问题如下:我的Python脚本正在使用next
以递归方式(recursive=True'
)搜索文件夹中的文件。关键是我有大量的文件,因为我一个接一个地处理所以不需要同时存储所有的文件名,所以我想使用生成器。关键是我的程序所做的是移动子目录中的文件,所以我担心{I}移动它后,glob
可能会找到相同的文件两次。
答案 0 :(得分:4)
您不能强制iglob()
提前阅读目录列表,不能。这就是发电机的工作原理;在你实际迭代之前,他们不会开始任何工作。因此,glob()
和iglob()
仅返回相同的结果,前提是文件系统在迭代完成之前不会更改。
主要是,iglob()
过滤懒洋洋地;对于简单的无路径,非递归的情况,一旦开始迭代就调用os.listdir()
,迭代只涉及过滤这些名称。
对于递归模式(使用**
)或路径名中使用的模式,iglob()
推迟加载子目录的目录列表;没有模式的最顶层目录仍然会立即加载,所以如果在迭代时子目录发生了变化,你也会得到不一致的结果。
如果需要在特定时间捕获文件系统的状态,请不要使用iglob()
。在这种情况下使用glob()
,并在Python列表中“冻结”该状态。