【问题标题】:Sort filenames in directory in ascending order with two levels按升序对目录中的文件名进行两级排序
【发布时间】:2019-12-04 12:01:29
【问题描述】:

我有一个包含 .jpg 文件(来自不同视频文件的帧)的目录。文件名看起来像 'frame_{}_{}'.format(number_of_video, frame_number)。 例如:'frame_1_1234.jpg'

如何通过两级排序按升序对文件进行排序?首先是 number_of_video,其次是 frame_number。

现在我有了这个:

['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() 盲目地将最重要的数字放在首位。

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    你可以使用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

    【讨论】:

    • @DmitryF 如果我的回答对您有帮助,请考虑将其标记为已接受。它向其他人表明您的问题已解决。
    • 非常感谢,我没有足够的声誉来标记它。
    【解决方案2】:

    您可能想要创建一个元组列表(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)]
    

    【讨论】:

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

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多