在Python中使用glob时,如何选择具有最新版本号的路径?

2024-09-30 10:40:47 发布

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

下面是代码片段:

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的路径字符串。是否有一种内置的方法来实现这一点,或者我是否仅限于通过字符串操作来实现这一点,即自定义解决方案


Tags: 方法字符串代码路径版本号解决方案内置glob
3条回答
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"也是一个有效的版本名

相关问题 更多 >

    热门问题