Python iglob按名称排序

时间:2012-11-11 21:59:32

标签: python sorting directory glob

我需要遍历一个潜在的非常大的目录(任意大)。根据我的理解,常规glob.glob函数在内存中存储所有匹配文件名的列表,但glob.iglob函数使用迭代器。因此,使用常规glob.glob函数是不可能的,因为目录中可能有很多文件。

我的问题是iglob以看似随机的顺序遍历目录。我希望它按字母顺序迭代文件。我无法一次获得所有文件名的列表,只是对它们进行排序,所以我想知道是否有办法让iglob按字母顺序遍历目录。

2 个答案:

答案 0 :(得分:5)

不,没有,没有将目录中的所有内容都读入内存。操作系统按目录顺序提供文件名,如果要对内容进行排序,则需要将内容完整地读入内存。

您可以在iglob()匹配的文件之后对结果进行排序,前提是该集合足够小,可以通过调用sorted()输出上的iglob()来适应内存:

for filename in sorted(iglob(path)):

答案 1 :(得分:1)

来自glob模块的documentation

  

glob模块查找与指定模式匹配的所有路径名   根据Unix shell使用的规则。没有波浪扩张   已完成,但*?和用[]表示的字符范围将是   正确匹配。 这是通过使用os.listdir() 和来完成的   fnmatch.fnmatch()协同工作,而不是实际调用   子外壳。

如果我们查看os.listdir的文档:

  

os.listdir(路径)

     

返回一个列表,其中包含path给出的目录中的条目名称。   列表按任意顺序。它不包括   特殊条目'。'和'..'即使它们存在于   。目录

因此glob.glob不会按字母顺序返回文件。文档中没有任何说明。依赖这种行为是一个错误。如果您想要一个有序序列,必须对结果进行排序。然后,您可以轻松地想象没有办法让iglob返回排序结果,因为它甚至没有所有结果可用。

如果记忆确实存在问题,那么你有两个选择:

  1. 删除“aplhabetical order”要求并使用iglob
  2. 使用某种“桶排序”对数据进行排序,将大部分数据保存在磁盘上并以块的形式将其加载到RAM中(这种技术在“计算机编程的艺术”第3册中有解释)。这种方法会使您的程序变慢并且可能更难写。但如果你真的无法将所有文件名保存在RAM中,那么你最终必须将它们保存在磁盘上。