2016-05-31 10 views
1

I持って次のようにフォルダからファイル名から作成されたリスト:Pythonの比較および削除ファイル

filename_1、filename_2、filename_3 ....

のは、「_」のファイル名である前に、その最初の部分を言ってみましょう番号はバージョンです。私は同じファイル名を持つすべてのファイルを比較し、最高のファイルを保持し、他のフォルダを削除する必要があります。

これまでのところ、フォルダからファイルを読み込み、file_nameversionに分割し、ファイル名でリストを作成しました。

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行をコメントアウトすることもできます。ここでは

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

私は車輪reinventionを避けるためにギルトのバージョンコントロールシステムを学ぶことを提案する: – pepr

答えて

1

は、あなたが探しているものを実現するスニペットです。

辞書を使用して最も高いバージョン番号のファイルの情報を保存しました。同じ名前のファイルが見つかるたびに、バージョン番号を比較して古いファイルを削除します。

また、コードは指定されたパターン(.*_[0-9]*)に従わないファイルには影響しません。

希望すると便利です。

+0

ありがとう、これは完璧です! –

+0

@ monk_13喜んで助けることができます=) この問題に関してもう助けが必要ない場合、私の答えを受け入れることができますか? – 3kt

関連する問題