iglob什么时候评估?

时间:2017-01-08 10:47:45

标签: python glob

文档说:

  

返回一个迭代器,它产生与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可能会找到相同的文件两次。

1 个答案:

答案 0 :(得分:4)

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

主要是,iglob() 过滤懒洋洋地;对于简单的无路径,非递归的情况,一旦开始迭代就调用os.listdir(),迭代只涉及过滤这些名称。

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

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