Python glob.glob排序-不符合预期

Python glob.glob排序-不符合预期,python,sorting,glob,Python,Sorting,Glob,我正在使用glob.glob从目录中读取一些文件,这些文件的名称如下:1.bmp 文件/名称以这种命名模式继续:1.bmp、2.bmp、3.bmp…等等 这是我目前拥有的代码,然而,从技术上讲,这是可以排序的,它并不像预期的那样。 files=sorted(glob.glob('../../Documents/ImageAnalysis.nosync/sliceImage/*.bmp')) 此方法按如下方式排序: ../../Documents/ImageAnalysis.nosync/slic

我正在使用glob.glob从目录中读取一些文件,这些文件的名称如下:
1.bmp

文件/名称以这种命名模式继续:
1.bmp、2.bmp、3.bmp…
等等

这是我目前拥有的代码,然而,从技术上讲,这是可以排序的,它并不像预期的那样。
files=sorted(glob.glob('../../Documents/ImageAnalysis.nosync/sliceImage/*.bmp'))

此方法按如下方式排序:

../../Documents/ImageAnalysis.nosync/sliceImage/84.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/85.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/86.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/87.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/88.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/89.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/9.bmp

在上面的代码中,我强调了这个问题,它能够很好地对文件名进行排序,例如
90-99。bmp
完全可以,但是在
89.bmp
90.bmp
之间有一个文件
9.bmp
这显然不应该在那里,应该在开始处

我期望的输出类型如下:

1.bmp
2.bmp
3.bmp
4.bmp
5.bmp
6.bmp
...
10.bmp
11.bmp
12.bmp
13.bmp
...
依此类推,直到文件结束


这可能与glob有关吗?

与glob.glob无关。它返回未排序的列表或根据基础系统的规则排序的列表

您需要做的是为排序的
提供合适的键函数,以定义所需的顺序,而不是作为纯文本字符串。类似(未经测试的代码):

然后


这是因为文件是根据名称(即字符串)排序的,并且它们是按字典顺序排序的。检查更多与排序相关的详细信息
要使事情如您所期望的那样正常工作,“错误”文件9.bmp应命名为09.bmp(这适用于所有此类文件)。如果您有100多个文件,情况会更清楚(所需的文件名将是009.bmp035.bmp

无论如何,还有一种替代方法(前提是所有文件都遵循命名模式),方法是将文件的基本名称(不带扩展名-检查)转换为int,并基于该int进行排序(通过提供key to)

files=sorted(glob.glob(“../../Documents/ImageAnalysis.nosync/sliceImage/*.bmp”),key=lambda x:int(os.path.splitext(os.path.basename(x))[0]))

您可以要求它根据排序的数字进行排序,如
排序(items,key=lambda x:int(re.findall(r'\d+',x)[0]))
?未经测试!可能是@hansolo的副本,谢谢!成功了!
1.bmp
2.bmp
3.bmp
4.bmp
5.bmp
6.bmp
...
10.bmp
11.bmp
12.bmp
13.bmp
...
def mysorter( x):
   path, fn = os.path.split( x)
   fn,ext = os.path.splitext( fn)
   if fn.isdigit():
       fnn = int(fn)
       fn = f'{fnn:08}'  # left pad with zeros
   return f'{path}/{fn}.{ext}'
   results=sorted( glob.glob(...), key=mysorter )