Python迭代器:iglob()的迭代器在glob()的列表中提供了什么?

ghi*_*man 22 python iterator

鉴于这段代码:

from glob import glob, iglob

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

print ''

for fn in iglob('/*'):
    print fn
Run Code Online (Sandbox Code Playgroud)

阅读glob 的文档我看到glob()返回一个基本的文件列表,iglob是一个Iterator.但是,我能够迭代两者,并且每个文件返回相同的文件列表.

我已经阅读了有关Iterator的文档,但它还没有真正了解这个主题!

那么iglob()返回一个Iterator会给我带来glob()的列表有什么好处呢?我是否能从我的老朋友那里获得额外的功能?

ami*_*mit 23

文档本身提到了不同之处:

返回一个迭代器,它产生与glob()相同的值,而不是实际同时存储它们.

基本上列表将包含内存中的所有项目.迭代器不需要,因此它需要更少的内存.

  • 只需添加它称为"懒惰评估".在我们不需要它之前,我们不会做任何事情. (4认同)
  • @LucaInvernizzi:我根本没有提到速度。`glob`也支持`**`。似乎“ formic”使用了“ os.walk”,而后者使用了“ os.listdir()”。对于您提供的链接,不清楚瓶颈在哪里是文件系统或python。您可以尝试[readdir()](http://stackoverflow.com/a/5091076/4279)甚至[getdents()](http://stackoverflow.com/a/7032186/4279)读取数百万个文件在单个级别 (2认同)

Rid*_*han 7

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

  • @Cody,假设您要删除文件夹 test 中以“w”开头的所有目录和文件。glob() 存储“test”内所有目录和文件夹的路径。假设“test”中有一个名为“willow”的文件夹,其中有文件“file1”、“file2”和“wfile3”。当您使用 glob() 并删除 'willow',然后尝试删除 'wfile3' 时,它将引发异常。如果使用 iglob(),文件和目录的路径将不会被预存储。所以,你甚至不会去 'wfile3; (3认同)