Pythons glob.glob是如何订购的?

Pythons glob.glob是如何订购的?,python,Python,我编写了以下Python代码: #!/usr/bin/python # -*- coding: utf-8 -*- import os, glob path = '/home/my/path' for infile in glob.glob( os.path.join(path, '*.png') ): print infile 现在我明白了: /home/my/path/output0352.png /home/my/path/output0005.png /home/my/pa

我编写了以下Python代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, glob

path = '/home/my/path'
for infile in glob.glob( os.path.join(path, '*.png') ):
    print infile
现在我明白了:

/home/my/path/output0352.png
/home/my/path/output0005.png
/home/my/path/output0137.png
/home/my/path/output0202.png
/home/my/path/output0023.png
/home/my/path/output0048.png
/home/my/path/output0069.png
/home/my/path/output0246.png
/home/my/path/output0071.png
/home/my/path/output0402.png
/home/my/path/output0230.png
/home/my/path/output0182.png
/home/my/path/output0121.png
/home/my/path/output0104.png
/home/my/path/output0219.png
/home/my/path/output0226.png
/home/my/path/output0215.png
/home/my/path/output0266.png
/home/my/path/output0347.png
/home/my/path/output0295.png
/home/my/path/output0131.png
/home/my/path/output0208.png
/home/my/path/output0194.png
它是以哪种方式订购的

澄清:我对订购不感兴趣-我知道
已排序
。我想知道它的默认顺序

它可能会帮助您获得我的ls-l输出:

-rw-r--r-- 1 moose moose 627669 2011-07-17 17:26 output0005.png
-rw-r--r-- 1 moose moose 596417 2011-07-17 17:26 output0023.png
-rw-r--r-- 1 moose moose 543639 2011-07-17 17:26 output0048.png
-rw-r--r-- 1 moose moose 535384 2011-07-17 17:27 output0069.png
-rw-r--r-- 1 moose moose 543216 2011-07-17 17:27 output0071.png
-rw-r--r-- 1 moose moose 561776 2011-07-17 17:27 output0104.png
-rw-r--r-- 1 moose moose 501865 2011-07-17 17:27 output0121.png
-rw-r--r-- 1 moose moose 547144 2011-07-17 17:27 output0131.png
-rw-r--r-- 1 moose moose 530596 2011-07-17 17:27 output0137.png
-rw-r--r-- 1 moose moose 532567 2011-07-17 17:27 output0182.png
-rw-r--r-- 1 moose moose 553562 2011-07-17 17:27 output0194.png
-rw-r--r-- 1 moose moose 574065 2011-07-17 17:27 output0202.png
-rw-r--r-- 1 moose moose 552197 2011-07-17 17:27 output0208.png
-rw-r--r-- 1 moose moose 559809 2011-07-17 17:27 output0215.png
-rw-r--r-- 1 moose moose 549046 2011-07-17 17:27 output0219.png
-rw-r--r-- 1 moose moose 566661 2011-07-17 17:27 output0226.png
-rw-r--r-- 1 moose moose 561678 2011-07-17 17:27 output0246.png
-rw-r--r-- 1 moose moose 525550 2011-07-17 17:27 output0266.png
-rw-r--r-- 1 moose moose 565715 2011-07-17 17:27 output0295.png
-rw-r--r-- 1 moose moose 568381 2011-07-17 17:28 output0347.png
-rw-r--r-- 1 moose moose 532768 2011-07-17 17:28 output0352.png
-rw-r--r-- 1 moose moose 535818 2011-07-17 17:28 output0402.png
它不是按文件名或大小排序的


其他链接:,

它可能根本没有排序,而是使用文件系统中条目出现的顺序,即使用
ls-U
时得到的顺序。(至少在我的机器上,这会产生与清单
glob
匹配项相同的顺序)。

glob.glob()是os.listdir()的包装器,因此底层操作系统负责传递数据。一般来说:您不能在这里对订单进行假设。基本假设是:没有排序。如果需要排序:在应用程序级别进行排序。

通过检查
glob.glob
的源代码,可以看到它在内部调用了
os.listdir
,如下所述:

关键语句:os.listdir(path) 返回一个列表,其中包含路径给定的目录中的条目名称。列表的顺序是任意的。它不包括特殊条目“.”和“..”,即使它们存在于目录中


任意顺序。:)

顺序是任意的,但您可以自己排序

如果要按名称排序,请执行以下操作:

sorted(glob.glob('*.png'))
按修改时间排序:

import os
sorted(glob.glob('*.png'), key=os.path.getmtime)
按大小排序:

import os
sorted(glob.glob('*.png'), key=os.path.getsize)
等等


我就是这样做的。希望对您有所帮助。

我也遇到了类似的问题,
glob
以任意顺序返回文件名列表,但我想按文件名所示的数字顺序逐一查看。我就是这样做到的:

我的文件由
glob
返回,类似于:

myList = ["c:\tmp\x\123.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\12.csv"]
我对列表进行了排序,为此我创建了一个函数:

def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])
此函数返回文件名的数字部分并将其转换为整数。然后,我调用了列表上的排序方法,如下所示:

myList.sort(key=sortKeyFunc)
["c:\tmp\x\12.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\123.csv"]
这返回了如下列表:

myList.sort(key=sortKeyFunc)
["c:\tmp\x\12.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\123.csv"]
请尝试以下代码:

sorted(glob.glob( os.path.join(path, '*.png') ),key=lambda x:float(re.findall("([0-9]+?)\.png",x)[0]))

顺序是任意的,但有几种方法可以对它们进行排序。其中之一是:

#First, get the files:
import glob
import re
files =glob.glob1(img_folder,'*'+output_image_format)
# if you want sort files according to the digits included in the filename, you can do as following:
files = sorted(files, key=lambda x:float(re.findall("(\d+)",x)[0]))

如果您想知道glob.glob过去在您的系统上做了什么,并且无法添加
sorted
调用,那么在其他Unix系统上的顺序将是一致的。因此,除非底层文件系统被重新组织,否则它可能是确定性的,如果文件被添加、删除、重命名、删除、移动等,就会发生这种情况。

从@Johan La Rooy的解决方案中,使用
排序(glob.glob('*.png'))对图像进行排序对我来说不起作用,输出列表仍然没有按名称排序

但是,
排序(glob.glob('*.png'),key=os.path.getmtime)
工作得很好

我有点困惑,为什么按名字排序在这里不起作用


感谢@Martin Thoma发布了这个伟大的问题,感谢@Johan La Rooy提供了有用的解决方案。

至少在Python3中,您也可以这样做:

import os, re, glob

path = '/home/my/path'
files = glob.glob(os.path.join(path, '*.png'))
files.sort(key=lambda x:[int(c) if c.isdigit() else c for c in re.split(r'(\d+)', x)])
for infile in files:
    print(infile)

这应该按字典顺序排列输入字符串数组(例如,排序时尊重字符串中的数字)。

我使用了内置的排序功能,因此可以解决此问题:

从pathlib导入路径
p=路径('/home/my/Path')
已排序(列表(p.glob('***.png'))


最后的答案似乎是
ls
命令本身按名称对文件进行排序ls-U'以“目录顺序”给出了一个无序的文件列表。在windows上它被排序了,所以我只是假设它总是这样。。现在在Ubuntu上,我花了很多钱调试。自我阅读api的注意事项!:0)与
os.listdir
的行为相同:*nix os以非字母顺序返回文件,并且(我很惊讶!):“列表的顺序是任意的”。我有文件,文件名只是整数,没有扩展名,所以我使用:
files=glob.glob('teksty/*')
。nam的命令会被批准吗?@mgalgs不,这不是我真正想问的问题。我想知道的是Xion的回答。按创建日期但按创建时间排序怎么样。因为它首先列出了newests文件。如何获取从旧文件到新文件的列表?非常感谢。请注意,getmtime和getsize相对昂贵-对许多文件执行此操作可能需要一段时间。
sorted
是python 3.8上未定义的函数。您应该更改答案以适应问题。问题不是排序。我知道(当时我也知道)如何分类。问题是关于默认顺序。感谢您提供此代码段,它可能会提供一些即时帮助。通过说明为什么这是一个很好的解决问题的方法,正确地解释它的教育价值,并将使它对未来有类似但不完全相同问题的读者更有用。请您的答案添加解释,并说明适用的限制和假设。与现有答案相比,您的答案有何贡献?@Martintoma如果文件中存在的整数不是零填充的,则排序不排序文件名是一个问题。排序从1000开始,上升到最高整数,然后从最小整数重新开始。如果我将数字归零,只需调用排序文件就可以完美地排序。因此,我认为这个解决方案解决了单独排序不起作用的问题。@Will.Evo尝试使用:
from natsort import natsorted;files=natsorted(files)
。您的答案很有帮助!是的,除非它做了特殊的工作,否则它将只显示操作系统提供的条目。与Unix中的命令“find”相同,它只是按照条目来自底层文件系统使用的数据结构的顺序转储条目。您不应该对其顺序做出任何假设,即使您会看到文件似乎是按创建顺序出现的。macOS上的APFS呢?我认为使用
os.path.split更优雅