在Python中使用Glob时,如何选择具有最新版本号的路径? 简短说明

问题描述

这是代码段:

glob.glob('C:\\intelFPGA\\*')
['C:\\intelFPGA\\17.1','C:\\intelFPGA\\18.0','C:\\intelFPGA\\18.1','C:\\intelFPGA\\20.0','C:\\intelFPGA\\9.2']

我需要一个方法,该方法将返回具有最新版本号(在这种情况下为18.1)的路径字符串。是否有内置的方法可以做到这一点,或者我仅限于通过字符串操作来实现此目的,即自定义解决方案?

解决方法

from pathlib import Path

root = Path('C:\\intelFPGA')
latest = max(root.glob('*'),key=lambda p: float(p.name))

如果版本中可以包含2个以上的部件,例如major.minor.patch,则此功能将无效。您可以改为:

root = Path('C:\\intelFPGA')
latest = max(root.glob('*'),key=lambda p: tuple(map(int,p.name.split('.'))))
,

这是解决方法:

from sortedcontainers import SortedDict

folders = ['C:\\intelFPGA\\17.1','C:\\intelFPGA\\18.0','C:\\intelFPGA\\18.1','C:\\intelFPGA\\20.0','C:\\intelFPGA\\9.2']


data = {}

for folder in folders:
    info = folder.split("\\")
    version = float(info[-1])
    data.update({version:folder})


s = SortedDict(data)
print(s)

您的结果将是:

SortedDict({9.2: 'C:\\intelFPGA\\9.2',17.1: 'C:\\intelFPGA\\17.1',18.0: 'C:\\intelFPGA\\18.0',18.1: 'C:\\intelFPGA\\18.1',20.0: 'C:\\intelFPGA\\20.0'})
,

您可以将pathlib.Path.glob()packaging.version.parse()结合使用:

from packaging import version
from pathlib import Path 


def get_latest(folder):
    selected_path = None
    latest_version = version.parse('0')
    for item in Path(folder).glob('*'):
        if not item.is_dir():
            continue

        ver = version.parse(item.name)

        if isinstance(ver,version.LegacyVersion):
            continue # not PEP 440 compatible version

        if ver > latest_version:
            latest_version = ver
            selected_path = str(item)

    return selected_path

latest_path = get_latest(r'C:\intelFPGA')

简短说明

  • glob('*')遍历文件夹中的所有内容
  • 需要item.is_dir()来过滤掉不是目录的所有内容
  • 需要isinstance(ver,version.LegacyVersion),因为那里可能有一个与您的模式不匹配的文件夹(文件夹名称中包含数字和点以外的其他字符。)
  • 版本比较需要packaging.version,因为version.parse('1.12') > version.parse('1.5'),但float('1.12') < float('1.5')"1.2.3"也是有效的版本名称。