我正在使用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有关吗?
答案 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]))