2016-05-31 75 views
1

我從文件名創建文件夾,從像這樣的列表:Python的比較和刪除文件

filename_1,filename_2,filename_3 ....

讓我們「_」爲文件名前說,第一部分並且數字在之後是版本。我需要比較具有相同文件名的所有文件,保持最高文件並從文件夾中刪除其他文件。

到目前爲止,我已經設法從文件夾加載文件,拆分爲file_nameversion並創建帶有文件名的列表。

file_list = []  
for path, subdirs, files in os.walk('folder_path'): 

     for filename in files: 
      file_version = filename.split('_') 
      file_name = parts[0] 
      version = int(parts[1]) 
      file_list.append(filename) 
+3

你在做的很好,繼續前進 – Idos

+0

使用一個字典,其文件名作爲鍵,值是一個版本列表。然後,您可以查看每個鍵並對列表進行排序並刪除舊鍵。提示:dict()。setdefault通常對這種模式有用。 –

+0

我建議學習Git版本控制系統,以避免輪子再造:) – pepr

回答

1

下面是一個片段實現你在找什麼:

import os 

version_matching = {} 

for path, subdirs, files in os.walk('test'): 

    print("Entering " + path) 

    for filename in files: 
     parts = filename.split('_') 

     file_name = parts[0] 

     try: 
      version = int(parts[1]) 
     except (IndexError, ValueError): 
      # In case some files don't follow the pattern 
      print("Skipping " + path + '/' + filename) 
      continue 

     if file_name not in version_matching: 

      # First time we see this file, save the informations 

      version_matching[file_name] = {"version": version, 
"path": path + '/' + filename} 

     elif version_matching[file_name]["version"] > version: 

      # We have already seen the file, 
      # but the one we are handling has a lower version number, 
      # we delete it 

      print("Removing " + path + '/' + filename) 
      os.remove(path + '/' + filename) 

     else: 

      # We have already seen the file, 
      # but this version is more recent, 
      # we delete the saved one 

      print("Removing " + version_matching[file_name]["path"]) 
      os.remove(version_matching[file_name]["path"]) 

      # And we update the saved infos 

      version_matching[file_name]["version"] = version 
      version_matching[file_name]["path"] = path + '/' + filename 

你可能想註釋掉os.remove線,以確保它的正確的事情。

我用字典來存儲具有最高版本號的文件的信息,並且每次找到同名的文件時,我會比較版本號並刪除舊文件。

另請注意,代碼不會損害不遵循指定模式的文件(.*_[0-9]*)。

希望它會有所幫助。

+0

謝謝,這是完美的! –

+0

@ monk_13很高興我可以幫忙=) 如果你不再需要關於此事的幫助,你能接受我的答案嗎? – 3kt