glob.glob排序-与预期不符

时间:2019-03-26 12:33:02

标签: 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/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.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有关吗?

2 个答案:

答案 0 :(得分: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 )

答案 1 :(得分:0)

这是因为文件是根据文件名(即字符串)进行排序的,并且按照字典顺序进行排序。检查[Python 3]: Sorting HOW TO了解更多与排序有关的详细信息。
为使事情按预期运行,应将“错误”文件 9.bmp 命名为 09.bmp (这适用于所有此类文件)。如果您有100个以上的文件,情况将会更加清晰(所需的文件名将为 009.bmp 035.bmp < / em> )。

无论如何,通过转换文件的基本名称(不带扩展名-选中{{3),可以选择另一种方法(前提是所有个文件都遵循命名模式) }})到 int ,然后根据该字符串进行排序(通过向[Python 3]: os.path - Common pathname manipulations提供 key

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