按两级升序对目录中的文件名进行排序

2024-06-17 13:24:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含.jpg文件(来自不同视频文件的帧)的目录。文件名看起来像“frame”{{{}。格式(视频的编号,frame编号)。 例如:“frame_1_1234.jpg”

如何使用两级排序按升序对文件进行排序?首先是视频的编号,其次是帧编号

现在我有这个:

['frame_0_0.jpg','frame_0_1.jpg','frame_0_10.jpg','frame_0_100.jpg','frame_0_1000.jpg','frame_0_1001.jpg','frame_0_1002.jpg','frame_0_1003.jpg','frame_0_1004.jpg','frame_0_1005.jpg','frame_0_1006.jpg','frame_0_1007.jpg',...]

我想要这个:

['frame_0_0.jpg', 'frame_0_1.jpg', 'frame_0_2.jpg',..., 'frame_1_0.jpg', 'frame_1_1.jpg', 'frame_1_2.jpg',...]

显然.sorted()首先盲目地选择最有效的数字


Tags: 文件目录视频排序文件名格式数字frame
3条回答

你也可以试试这个

set1=['frame_0_0.jpg'、'frame_0_1.jpg'、'frame_2_10.jpg'、'frame_1_100.jpg'、'frame_0_1000.jpg'、'frame_0_1001.jpg'、'frame_0_1002.jpg'、'frame_0_1003.jpg']

set1.sort()#将对列表中的元素进行排序

如果再次打印set1,您将得到如下结果: ['frame_0_0.jpg'、'frame_0_1.jpg'、'frame_0_1000.jpg'、'frame_0_1001.jpg'、'frame_0_1002.jpg'、'frame_0_1003.jpg'、'frame_1_100.jpg'、'frame_2_10.jpg']

您可能需要创建一个元组列表(number_of_video, frame_number),对列表进行排序,然后创建文件名

tuples = [(0,0), (0,1), (0,10), (0,100), (0,1000), ...]
filenames = [f"frame_{t[0]}_{t[1]}.jpg" for t in sorted(tuples)]

您可以使用sortedkey参数:

import re


def key(value):
    """Extract numbers from string and return a tuple of the numeric values"""
    return tuple(map(int, re.findall('\d+', value)))


values = ['frame_0_0.jpg', 'frame_0_1.jpg', 'frame_0_10.jpg', 'frame_0_100.jpg',
          'frame_0_1000.jpg', 'frame_0_1001.jpg', 'frame_0_1002.jpg', 'frame_0_1003.jpg',
          'frame_0_1004.jpg', 'frame_0_1005.jpg', 'frame_0_1006.jpg', 'frame_0_1007.jpg']

result = sorted(values, key=key)
print(result)

输出

['frame_0_0.jpg', 'frame_0_1.jpg', 'frame_0_10.jpg', 'frame_0_100.jpg', 'frame_0_1000.jpg', 'frame_0_1001.jpg', 'frame_0_1002.jpg', 'frame_0_1003.jpg', 'frame_0_1004.jpg', 'frame_0_1005.jpg', 'frame_0_1006.jpg', 'frame_0_1007.jpg']

请注意,键使用正则表达式来查找字符串中的数字,您可以找到有关它们的更多信息,here

相关问题 更多 >