Python glob.iglob结果是否按名称排序?
我需要遍历一个潜在的非常大的目录(任意大)。据我所知,常规的Python glob.iglob结果是否按名称排序?,python,sorting,directory,glob,Python,Sorting,Directory,Glob,我需要遍历一个潜在的非常大的目录(任意大)。据我所知,常规的glob.glob函数在内存中存储所有匹配文件名的列表,但是glob.iglob函数使用迭代器。因此,使用常规的glob.glob函数是不可能的,因为目录中可能有很多文件 我的问题是,iglob以看似随机的顺序遍历目录。我希望它能按字母顺序遍历这些文件。我无法一次获得所有文件名的列表,而只是对它们进行排序,因此我想知道是否有办法使iglob按字母顺序遍历目录。不,没有,除非将目录的所有内容读入内存。操作系统按目录顺序提供文件名,如果要对
glob.glob
函数在内存中存储所有匹配文件名的列表,但是glob.iglob
函数使用迭代器。因此,使用常规的glob.glob
函数是不可能的,因为目录中可能有很多文件
我的问题是,
iglob
以看似随机的顺序遍历目录。我希望它能按字母顺序遍历这些文件。我无法一次获得所有文件名的列表,而只是对它们进行排序,因此我想知道是否有办法使iglob
按字母顺序遍历目录。不,没有,除非将目录的所有内容读入内存。操作系统按目录顺序提供文件名,如果要对这些文件进行排序,还需要将内容完整地读入内存
您可以在iglob()
匹配的文件之后对结果进行排序,前提是该集合足够小,可以通过调用iglob()
输出上的sorted()
装入内存:
for filename in sorted(iglob(path)):
请注意,当不递归到子目录时,
iglob()
已经存在(部分原因是)。来自glob
模块:
glob
模块查找与指定模式匹配的所有路径名
根据unixshell使用的规则。不需要瓷砖扩展
已完成,但*
,?
和用[]
表示的字符范围将被删除
正确匹配这是通过使用os.listdir()
和
fnmatch.fnmatch()
地下室
如果我们在文档中查找os.listdir
:
os.listdir(路径)
返回一个列表,其中包含路径给定的目录中的条目名称。
列表按任意顺序排列。它不包括
特殊条目“.”和“..”,即使它们出现在
目录
因此glob.glob
不会按字母顺序返回文件。文件中没有说明。依赖这种行为是一个错误。如果你想要一个有序的序列,你必须对结果进行排序。然后,您可以很容易地想象,无法使iglob
返回排序结果,因为它甚至没有所有可用的结果
如果内存确实是个问题,那么您有两个选择:
放弃“应用顺序”要求,只需使用iglob
使用某种类型的“桶排序”对数据进行排序,将大部分数据保存在磁盘上,并将其分块加载到RAM中(此类技术在《计算机编程艺术》第3册中进行了解释)。这种方法会使您的程序速度变慢,并且可能更难编写。但是如果你真的不能在RAM中保存所有的文件名,那么你最终必须将它们保存在磁盘上
多少是很多
?现代计算机在内存中保存数百万个文件名不会有任何问题。在iglob上排序将通过将所有内容提取到内存中耗尽迭代器。@Vadim:如果需要迭代器,您可以始终执行iter(排序(iglob(路径))
来获得一个迭代器(尽管这仍然会将所有名称读入内存,因为这是对它们进行排序所必需的)。