【问题标题】:Find Maximum Version from List of Files从文件列表中查找最大版本
【发布时间】:2014-09-29 15:52:32
【问题描述】:

我需要一些关于我的 Linux 系统的 python 编码帮助。

我正在尝试对包含大约 30 个文件的目录进行排序。大多数文件是重复的,但每次开发新代码时都会增加。我需要为每组文件选择最高版本。

我需要从下面显示的文件列表中获取 AzMesa、AzChandler 和 AzPhoenix 的最高版本。版本号总是跟在第二个“-”之后,在句点“.”之前。这种格式不会改变,尽管有时城市会发生变化,但它总是以 Az 开头,总是以 rpm 结尾,有时“13.13”会随着我们发布代码而增加。

AzMesa-13.13-1.x86_64.rpm
AzMesa-13.13-2.x86_64.rpm
AzMesa-13.13-3.x86_64.rpm
AzChander-13.13-1.x86_64.rpm
AzChander-13.13-2.x86_64.rpm
AzPhoenix-13.13-1.x86_64.rpm
AzPhoenix-13.13-2.x86_64.rpm
AzPhoenix-13.13-3.x86_64.rpm
AzPhoenix-13.13-4.x86_64.rpm
AzPhoenix-13.13-5.x86_64.rpm

下面的代码捕获了所有以“Az”开头并以“rpm”结尾的文件。然后它会打印出包名称并打印出版本。

for name in glob.glob('Az*.rpm'):
  Package,Trash,CombinedVersion=name.split("-")
  print Package

  Version,Trash,Trash2=CombinedVersion.split(".")
  print Version

我需要一种方法来仅从具有最高版本号的每个组中捕获一个文件并将该输出发送到文件。

任何帮助将不胜感激。我不自称是python开发者,只是尽力而为。

【问题讨论】:

    标签: python sorting max unique


    【解决方案1】:

    你可以使用python结构dict,它保存键值对,并将版本转换为int的元组,所以它是可比的。

    newest = dict()
    
    for name in glob.glob('Az*.rpm'):
        #don't throw away the 13.13 - make one version
        package, combined_big_version, combined_version = name.split("-")
    
        #split the big vesrion into parts
        big1, big2 = combined_big_version.split(".")
        small_version, trash, trash2 = combined_version.split(".")
    
        #convert into a tuple of ints so we can compare them (biggest version first)
        #for example (13, 13, 1) < (13, 13, 2)
        #but         (13, 14, 1) > (13, 13, 4000)
    
        version = (int(big1), int(big2), int(small_version))
    
    
        #add to dictionary, or update if newer
        #store tuple (version, name) so we can get the name back 
        if not package in newest: 
            newest[package] = (version, name)
        else:
            newest[package] = max (newest[package], (version, name))
    

    那么你可以这样做:

    for package in newest.keys():
        print package, newest[package]
    
    # AzMesa (13, 13, 3)
    # AzPhoenix (13, 13, 5)
    # AzChander (13, 13, 2)
    
    print list(newest.items())
    
    # [('AzMesa', (13, 13, 3)), ('AzPhoenix', (13, 13, 5)), ('AzChander', (13, 13, 2))]
    
    
    # get the file names
    names = [newest[key][1] for key in newest]
    print (names)
    
    # ['AzChander-13.13-2.x86_64.rpm', 'AzPhoenix-13.13-5.x86_64.rpm', 'AzMesa-13.13-3.x86_64.rpm']
    

    【讨论】:

    • 这很好用,感谢您的帮助。碰巧有没有办法为最高版本捕获文件的“名称”?我正在寻找从列表中编译文件名的方法,但我想如果我可以简单地将“名称”存储在您的代码中会更容易。归根结底,我需要获取版本最高的三个文件名。
    • 编辑代码以通过存储元组(版本,名称)而不是版本来记住文件名。
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多