我需要遍历潜在的[[very大目录(任意大)。据我了解,常规的glob.glob
函数在内存中存储了all匹配文件名的列表,但是glob.iglob
函数使用了迭代器。因此,使用常规glob.glob
函数是不可能的,因为目录中可能有A lot个文件。
iglob
以看似随机的顺序遍历目录。我希望它按字母顺序遍历文件。我无法一次获得所有文件名的列表,而只能对其进行排序,所以我想知道是否有一种方法可以使iglob
以字母顺序遍历该目录。您可以在iglob()
个匹配的文件之后对结果进行排序,只要该集合足够小,可以通过在sorted()
输出上调用iglob()
来放入内存:
for filename in sorted(iglob(path)):
请注意,iglob()
在不递归到子目录时已经loads all entries of a single directory into a list(部分是因为fnmatch()
returns a list)。
fnmatch()
模块的glob
:documentation模块找到与指定模式匹配的所有路径名根据Unix shell使用的规则。没有波浪号扩展完成,但是如果我们查看glob
,*
和用?
表示的字符范围将是正确匹配。这是通过使用
[]
完成的和os.listdir()
共同起作用,而不是通过实际调用子外壳。
fnmatch.fnmatch()
的文档:os.listdir(path)。它不包括特殊条目“。”和“ ..”,即使它们存在于目录。因此返回一个包含路径指定目录中条目名称的列表。
列表按任意顺序排列
os.listdir
不会按字母顺序返回文件。在文档的任何地方都没有说明。依靠这种行为是一个错误。如果要排序的序列,请必须对结果进行排序。然后,您可以轻松地想象,由于glob.glob
甚至没有全部结果可用,因此无法使它返回排序的结果。
iglob
。