Python glob.glob排序-不符合预期
我正在使用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
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.bmp,035.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 )