我需要遍历一个潜在的非常大的目录(任意大)。根据我的理解,常规glob.glob
函数在内存中存储所有匹配文件名的列表,但glob.iglob
函数使用迭代器。因此,使用常规glob.glob
函数是不可能的,因为目录中可能有很多文件。
我的问题是iglob
以看似随机的顺序遍历目录。我希望它按字母顺序迭代文件。我无法一次获得所有文件名的列表,只是对它们进行排序,所以我想知道是否有办法让iglob
按字母顺序遍历目录。
答案 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
返回排序结果,因为它甚至没有所有结果可用。
如果记忆确实存在问题,那么你有两个选择:
iglob
。