glob.glob 排序 - 不符合预期

2024-04-09

我使用 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

../../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.bmp and 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 来做吗?


这是因为文件是根据名称(字符串)排序的,并且按字典顺序排序。查看[Python.Docs]:排序方法 https://docs.python.org/howto/sorting.html#sorting-how-to了解更多排序相关详细信息。
为了让事情按照你的预期工作,“错误”文件9.bmp应命名为:

  • 09.bmp:(这适用于所有此类文件)因为它们的数量超过 10 个

  • 009.bmp(另一个例子:035.bmp): 如果有超过 100 个文件 - 这里事情就更清楚了

  • 0009.bmp: 超过 1000 个文件

  • ...

在不预先知道文件总数的情况下,像这样命名文件可能会很棘手。

无论如何,还有一个替代方案(前提是all文件的名称遵循命名模式),通过转换文件的基本名称(不带扩展名 - 检查[Python.Docs]:os.path - 常见路径名操作 https://docs.python.org/library/os.path.html) to an int,并基于此进行排序(通过提供key to [Python.Docs]:排序(可迭代,*,key=None,reverse=False) https://docs.python.org/library/functions.html#sorted):

files = sorted(glob.glob("../../Documents/ImageAnalysis.nosync/sliceImage/*.bmp"),
               key=lambda arg: int(os.path.splitext(os.path.basename(arg))[0]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

glob.glob 排序 - 不符合预期 的相关文章

随机推荐