使用glob,匹配目录模式并根据顺序返回最高

时间:2014-06-06 15:44:08

标签: python glob

我有一个目录

C:\Chrome\
  |-31.0.1649.39
  |-31.0.1650.38
  |-31.0.1650.39
  |-31.0.1651.37
  |-31.1.1650.38
  |-32.0.1700.4
  |-33.0.1750.154
  |-34.0.1847.137

鉴于基础版本,我做

newest = glob.glob(r"C:\Program Files\Chrome\{0}.*.*.*\chrome.exe".format(base_version))[-1]

有谁知道更好的方法吗?我的犹豫是朝着通配符,我尝试只匹配数字[0-9],但我无法工作,并认为如果这工作,目录将始终在此约定中命名,没有其他目录存在。我应该使用re吗?另一个问题是glob是否总是返回一个有序列表,其中最高版本是最后一个元素。这会在另一个系统上有所不同吗?

2 个答案:

答案 0 :(得分:2)

您需要将版本号转换为整数列表才能使其正确排序。您可以枚举globbed结果并构建包含2元组(version_list,file_path)的第二个列表,并对其进行排序:

chromedirs = []
# list chrome directories
for chromedir in glob.glob(r"C:\Program Files\Chrome\{0}.*.*.*".format(base_version):
    try:
        # decimalized version list for sorting
        chrome_ver = [int(d) for d in os.path.basename(chromedir).split('.')]
        chromedirs.append((chrome_ver, chromedir))
    except ValueError:
        continue
if chromedirs:
    # sort the result and grab the last
    chrome = os.path.join(chromedirs.sort()[-1][1], 'chrome.exe')
    print chrome

答案 1 :(得分:1)

glob以任意顺序返回文件,您必须对输出进行排序。

如果您知道文件名将总是具有相同的位数,您可以按文字排序,这更简单:

newest = sorted( glob.glob(r"{0}.*\chrome.exe".format(base_version))[-1]