问题描述
这是代码段:
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"
也是有效的版本名称。