【问题标题】:Get file names into list using glob [duplicate]使用 glob 将文件名放入列表 [重复]
【发布时间】:2019-05-03 12:48:10
【问题描述】:

我想将文件名加载到数组中以从其路径加载图像。这项工作由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"]

【问题讨论】:

  • 我认为'os.listdir'会实现这一点。

标签: python


【解决方案1】:

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".

【讨论】:

    【解决方案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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 2018-04-14
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多