Python迭代器:iglob()和#x27;在glob()和#x27;谁的名单?

Python迭代器:iglob()和#x27;在glob()和#x27;谁的名单?,python,iterator,Python,Iterator,给定一段代码: from glob import glob, iglob for fn in glob('/*'): print fn print '' for fn in iglob('/*'): print fn 读取for glob时,我看到glob()返回一个基本的文件列表,而iglob返回一个迭代器。但是,我可以对这两个文件进行迭代,并且每个文件都返回相同的文件列表 我已经阅读了上的文档,但它并没有真正阐明这个主题 那么iglob()返回迭代器给我提供了glob

给定一段代码:

from glob import glob, iglob

for fn in glob('/*'):
    print fn

print ''

for fn in iglob('/*'):
    print fn
读取for glob时,我看到glob()返回一个基本的文件列表,而iglob返回一个迭代器。但是,我可以对这两个文件进行迭代,并且每个文件都返回相同的文件列表

我已经阅读了上的文档,但它并没有真正阐明这个主题


那么iglob()返回迭代器给我提供了glob()列表上的什么好处呢?我是否比我的老朋友低级别列表获得了额外的功能?

文档中提到了区别:

返回一个迭代器,该迭代器生成与glob()相同的值,而实际上不同时存储所有值


基本上,列表中的所有项都在内存中。迭代器不需要,因此需要更少的内存。

添加到。iglob()在特定情况下非常有用,如果删除列表中的目录,列表中的文件和文件夹将由glob()存储,因此进一步访问循环会引发异常。但是通过使用iglob(),我们可以克服并发修改异常

,只需添加它被称为“惰性评估”。除非我们不需要它,否则我们不会做任何事情。注意:对于单个目录,内存使用是相同的(由于当前通过
os.listdir()
实现)。如果有多个包含许多文件的目录,那么优势就存在了。正如@J.F.Sebastian所说,iglob相对于glob的速度/内存优势受到os.listdir()的阻碍(请参阅):这意味着它们都比包含大量文件的目录慢。如果你有这个问题,请检查。例如。@LucaInvernizzi:我根本没有提到速度
glob
也支持
**
。似乎
formic
使用了
os.walk
而使用了
os.listdir()
。对于您提供的链接,不清楚瓶颈是文件系统还是python。你可以尝试甚至在一个级别上读取数百万个文件,我不明白,请你详细说明一下。谢谢@Coddy,假设您要删除文件夹测试中以“w”开头的所有目录和文件。glob()存储“test”中所有目录和文件夹的路径。假设“test”中有一个名为“willow”的文件夹,其中有文件“file1”、“file2”和“wfile3”。当您使用glob()并删除“willow”,然后尝试删除“wfile3”时,它将引发异常。如果使用iglob(),则不会预存储文件和目录的路径。所以,你甚至不会去“wfile3”;