glob.glob排序 - 不像预期的那样

问题描述 投票:0回答:2

我正在使用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/image analysis.no sync/slice image/9.BMP

../../Documents/ImageAnalysis.nosync/sliceImage/90.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/91.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/92.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/93.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/94.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/95.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/96.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/97.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/98.bmp
../../Documents/ImageAnalysis.nosync/sliceImage/99.bmp

在上面的代码我真的突出了问题,它能够很好地排序文件名,例如90-99.bmp是完全正常但是在89.bmp90.bmp之间有文件9.bmp这显然不应该在那里,应该在开始附近

我期待的那种输出是这样的:

1.bmp
2.bmp
3.bmp
4.bmp
5.bmp
6.bmp
...
10.bmp
11.bmp
12.bmp
13.bmp
...

依此类推,直到文件结束

这可能与glob有关吗?

python sorting glob
2个回答
0
投票

不是glob.glob。它返回一个未排序的列表或根据底层系统的规则排序。

你需要做的是为sorted提供一个合适的键函数,以定义你想要的顺序,而不是纯文本字符串。像(未经测试的代码):

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 )

0
投票

这是因为文件根据其名称(字符串)排序,并按字典顺序排序。检查[Python 3]: Sorting HOW TO以获取更多排序相关的详细信息。 为了使您能够按预期工作,“故障”文件9.bmp应命名为09.bmp(这适用于所有此类文件)。如果你有超过100个文件,事情会更清晰(所需的文件名将是009.bmp,035.bmp)。

无论如何,有一个替代方案(假设所有文件都遵循命名模式),通过将文件的基本名称(没有扩展名 - 检查[Python 3]: os.path - Common pathname manipulations)转换为int,并基于此排序(通过提供[Python 3]: sorted(iterable, *, key=None, reverse=False)的密钥)

files = sorted(glob.glob("../../Documents/ImageAnalysis.nosync/sliceImage/*.bmp"), key=lambda x: int(os.path.splitext(os.path.basename(x))[0]))
© www.soinside.com 2019 - 2024. All rights reserved.