使用Glob将文件名放入列表

时间:2019-05-03 12:48:11

标签: python

我想将文件名加载到数组中以从其路径加载图像。这项工作由here提供的解决方案完成。我的代码是这样的

fileNames = glob.glob(os.path.join(directory, "*.jpg"))

我的文件名与此模式类似

{videoNo}_{frameNo}_{patchNo).jpg

例如,他们的名字是这样的

1_1_1.jpg
1_1_2.jpg
1_1_3.jpg
.
.
.
10_1_1.jpg
10_1_2.jpg

当我将文件名加载到fileNames数组中时,它们就像这样

10_1_1.jpg
10_1_2.jpg
.
.
.
1_1_1.jpg
1_1_2.jpg
1_1_3.jpg

据我所知,这是因为_的asci代码比0大,因此名称列表未排序!我必须使用排序列表。有人可以帮我吗?


编辑
请注意,这些文件名的排序方式

 ["1_1_1.jpg", "10_1_3.jpg", "1_1_2.jpg", "10_1_2.jpg", "1_1_3.jpg", "1_20_1", "1_2_1", "1_14_1"]

类似于此排序列表

 ["1_1_1.jpg", "1_1_2.jpg", "1_1_3.jpg", "1_2_1.jpg", "1_14_1", "1_20_1", "10_1_2.jpg", "10_1_3"]

2 个答案:

答案 0 :(得分:3)

sorted builtinlist.sort method都使用 key 参数,该参数指定如何进行排序。如果要按名称中的数字排序(即videoNo,然后是frameNo,然后是patchNo),则可以将每个名称拆分为以下数字:

fileNames = sorted(
    glob.glob(os.path.join(directory, "*.jpg")),
    key=lambda item: [
        int(part) for part in os.path.splitext(item)[0].split('_')
    ],
)

分割将剥离.jpg扩展名,然后在每个_上剪切名称。需要转换为int,因为字符串使用字典编排排序,例如"2" > "10"

答案 1 :(得分:2)

您可以使用正则表达式从文件名中提取数字并按以下顺序排序:

>>> import re
>>> files = ["10_1_3.jpg", "1_10_2.jpg", "3_1_1.jpg", "30_1_2.jpg"]
>>> sorted(files, key=lambda f: tuple(map(int, re.findall(r"\d+", f))))
['1_10_2.jpg', '3_1_1.jpg', '10_1_3.jpg', '30_1_2.jpg']