Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python glob.iglob结果是否按名称排序?_Python_Sorting_Directory_Glob - Fatal编程技术网

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(路径))
    来获得一个迭代器(尽管这仍然会将所有名称读入内存,因为这是对它们进行排序所必需的)。