2013-07-31 62 views
0

这让我难住...确定文件的最新版本(python)

我有一个文件夹中的文件列表。例如。

myFiles = ["apple_d_v01.jpg", "apple_d_v02.jpg", "apple_d_v03.jpg", "something_d.jpg", "anotherthing_d.jpg"] 

有三个版本的文件“apple_d”,使用版本后缀“_vxx”。我希望能够修改列表,以便只有最新版本,使

myFiles = ["apple_d_v03.jpg", "something_d.jpg", "anotherthing_d.jpg"] 

任何想法?

非常感谢。

编辑:想出了这个早晨,它的目的很好,但与我最初提出的问题有点不同。感谢所有帮助。

myFiles = ["apple_d.jpg", "apple_dm.jpg", "apple_d_v2.jpg", "apple_d_v3.jpg", "something_d.jpg", "anotherthing_d.jpg", "test2_s_v01", "test2_s_v02.jpg", "test2_s_v03.jpg", "test2_s_v04.jpg" ] 

objVersions = [] 


obj = "cube" #controlled by variable 
suf = "d"  #controlled by variable 
ext = ".jpg" #controlled by variable 

for file in myFiles: 


    if obj + "_" + suf + "_" in file: 
     objVersions.append(file) 

    if obj + "_" + suf + "." in file: 
     objVersions.append(file) 

objVersions = sorted(objVersions, reverse=True) 

for file in objVersions: 

    if ext not in file: 
     objVersions.remove(file) 


chosenfile = objVersions[0] 
+1

到目前为止你有什么? – kindall

+0

我发布了一个非常基本的答案。如果您发布了您所做的事情,我可以改进这一点,以便更好地了解您所寻找的内容。 '这让我难住'你到目前为止尝试过什么? – inspectorG4dget

回答

0

假设d是你的问题一个版本号

latestVersion = max(int(fname.rsplit('.',1)[0].rsplit("_",1)[1].strip('v')) for fname in myFiles) 

从您的意见,我知道你想保留版本的文件的最新版本。对于这一点,你需要这样的:

answer = set() 
for fname in myFiles: 
    name, version = fname.rsplit('.', 1)[0].rsplit("_",1) 
    if version.startswith('v'): # this is a versioned file 
     answer.add(
      max((fname for fname in myFiles if fname.startswith(name) and not fname.rsplit('.', 1)[0].endswith('d')), 
       key=lambda fname: int(
        fname.rsplit('.', 1)[0].rsplit("_",1)[1].strip('v')))) 
    else: 
     answer.add(fname) 
0

这个方法我做了我想会做你的要求,它需要的文件名列表,发现最新版本,它然后搜索包含的所有文件版本标签,并删除那些不是最新的。如果某些文件只更新到第2版和别人3.

def removePreviousVersions(FileNameList): 
    returnList = [] 
    LatestVersion = 0 
    for FileName in FileNameList: 
     if FileName.find('_v') > -1: 
      Name, Version = (FileName.replace('.jpg', '')).split('_v') 
      if LatestVersion < int(Version): 
       LatestVersion = int(Version) 

    argument = '_v'+ str(LatestVersion).zfill(2) 
    for FileName in FileNameList: 
     if FileName.find('_v') == -1: 
      returnList.append(FileName)   
     elif FileName.find(argument) != -1: 
      returnList.append(FileName) 

    return returnList 

这个例子就在这里,它不会工作使用类似的方法工作,但它会抢了最新版本的文件,即使它是一个旧版本的文件的最新版本。

def removePreviousVersions(FileNameList): 
TempFileNameList = [] 
ReturnList = [] 
for FileName in FileNameList: 
    if '_v' in FileName: 
     Name, Version = (FileName.replace('.jpg', '')).split('_v') 
     if Name not in TempFileNameList: 
      TempFileNameList.append(Name) 
      latestVersion = 0 
      TempFileName = '' 
      for fname in FileNameList: 
       if Name in fname: 
        tName, tVersion = (fname.replace('.jpg', '')).split('_v') 
        if int(tVersion) > int(latestVersion): 
         latestVersion = int(tVersion) 
         TempFileName = fname 
      ReturnList.append(TempFileName) 
    else: 
     ReturnList.append(FileName) 

return ReturnList 

示例输入:

NameList中= [ “stupd_d_v01.jpg”, “apple_d_v01.jpg”, “apple_d_v02.jpg”, “apple_d_v03.jpg”, “something_d.jpg”,“anotherthing_d。 JPG “]

返回[” stupd_d_v01.jpg”, “apple_d_v03.jpg”, “something_d.jpg”, “anotherthing_d.jpg”]

+0

嗨Dh0rse,感谢您的输入。这看起来不错,虽然肯定会有一些文件比其他版本有更多进步的版本。如果你不介意再修改一下,我会非常感谢 – user2407089

+0

看看我的第二个解决方案,我相信这就是你要找的,这是慢一点,因为它是做两个for循环,但是它会得到你需要的信息。 – Dh0rse

+0

干杯Dh0rse。也会检查一下。有一段时间让代码运行.. – user2407089

0

假设版本总是与_v的语法## ,你可以这样做:

import re 

parts_re = re.compile(r'^(.+_d)(.*)\.jpg$') 

def remove_oldies(list): 
    final = [] 
    saved_version = '' 
    saved_name = '' 
    for item in sorted(list): 
     name, version = parts_re.search(item).group(1,2) 
     if name != saved_name: 
      if saved_name != '': 
       final.append(saved_name + saved_version + ".jpg") 
      saved_version = version 
      saved_name = name 
     else: 
      saved_version = version 
    final.append(saved_name + saved_version + ".jpg") 
    return final 

    remove_oldies(myFiles) 
+0

干杯pcm-我会检查这个解决方案。 – user2407089

0

短(和功能)的答案是这样的:

files= [ (f.split("_d")[0],int("0"+re.search("((_v)?([0-9]+|))\.jpg",f.split("_d")[1]).group(3)),f) for f in myFiles] 
result= [ [ f[2] for f in files if f[0] == fn and f[1] == max([ f[1] for f in files if f[0] == fn ]) ][0] for fn in set(f[0] for f in files) ] 


有了位扩展和评论说:

# List of tuples of the form ('apple', 2, 'apple_d_v02.jpg') and ('something', 0, 'something_d.jpg') 
files= [ (f.split("_d")[0],int("0"+re.search("((_v)?([0-9]+|))\.jpg",f.split("_d")[1]).group(3)),f) for f in myFiles] 
basename= 0 # index of basename (apple, something, etc) in each tuple inside "files" 
version= 1 # index of version in each tuple inside "files" 
fullname= 2 # index of full filename in each tuple inside "files" 

result= [ [ f[fullname] for f in files if f[basename] == current_basename and f[version] == max([ f[version] for f in files if f[basename] == current_basename ]) ][0] for current_basename in set(f[basename] for f in files) ] 


尾线可以进一步扩展到:

def max_version_fullname(current_basename): 
    versions= [ f[version] for f in files if f[basename] == current_basename ] 
    max_version= max(versions) 
    fullnames_for_max_version= [ f[fullname] for f in files if f[basename] == current_basename and f[version] == max_version ] 
    fullname_for_max_version= fullnames_for_max_version[0] 
    return fullname_for_max_version 
basenames= set(f[basename] for f in files) 
result= [ max_version_fullname(current_basename) for current_basename in basenames ] 
+0

感谢马里奥 - 我会研究这一点,并尝试消化你的代码 – user2407089