glob.iglob结果按名称排序?

问题描述 投票:5回答:2

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

我的问题是,iglob以看似随机的顺序遍历目录。我希望它按字母顺序遍历文件。我无法一次获得所有文件名的列表,而只能对其进行排序,所以我想知道是否有一种方法可以使iglob以字母顺序遍历该目录。
python sorting directory glob
2个回答
5
投票
不,没有,不是不把目录的所有内容读入内存。操作系统按目录顺序提供文件名,并且如果要对它们进行排序,还需要将其内容全部读入内存。

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

for filename in sorted(iglob(path)):

请注意,iglob()在不递归到子目录时已经loads all entries of a single directory into a list(部分是因为fnmatch() returns a list)。

1
投票
fnmatch()模块的glob

documentation模块找到与指定模式匹配的所有路径名根据Unix shell使用的规则。没有波浪号扩展完成,但是glob*和用?表示的字符范围将是正确匹配。

这是通过使用[]完成的和os.listdir()共同起作用,而不是通过实际调用子外壳。

如果我们查看fnmatch.fnmatch()的文档:

os.listdir(path)

返回一个包含路径指定目录中条目名称的列表。

列表按任意顺序排列

。它不包括特殊条目“。”和“ ..”,即使它们存在于目录。因此os.listdir不会按字母顺序返回文件。在文档的任何地方都没有说明。依靠这种行为是一个错误。如果要排序的序列,请

必须对结果进行排序。然后,您可以轻松地想象,由于glob.glob甚至没有全部结果可用,因此无法使它返回排序的结果。

如果确实存在内存问题,那么您有两种选择:

    放弃“ apbhabetical顺序”要求,而只需使用iglob
  1. 使用某种“存储桶排序”对数据进行排序,将大多数数据保留在磁盘上,然后将其以块的形式加载到RAM中(此类技术在《计算机编程的艺术》第三册中进行了说明)。这种方法会使您的程序变慢,并且可能很难编写。但是,如果您真的不能将所有文件名都保存在RAM中,那么最终必须将它们保存在磁盘上。
© www.soinside.com 2019 - 2024. All rights reserved.