【问题标题】:glob.glob sorting - not as expectedglob.glob 排序 - 不像预期的那样
【发布时间】:2019-08-16 20:17:48
【问题描述】:

我正在使用 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 和 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 sorting glob


【解决方案1】:

这是因为文件是根据它们的名称(即字符串)排序的,并且它们是按字典顺序排序的。查看[Python.Docs]: Sorting HOW TO 了解更多排序相关的详细信息。
为了让事情如您所愿,“错误”文件 9.bmp 应命名为 09.bmp(这适用于所有此类文件)。如果您有超过 100 个文件,事情会更加清晰(所需的文件名将是 009.bmp、035.bmp)。

无论如何,有一个替代方案(前提是所有文件都遵循命名模式),通过转换文件的基本名称(不带扩展名 - 检查[Python.Docs]: os.path - Common pathname manipulations ) 到一个 int,并根据它进行排序(通过将 key 提供给[Python.Docs]: 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]))

【讨论】:

    【解决方案2】:

    不适用于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 )
    

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2012-06-13
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多