2017-10-19 6 views
2

ディレクトリ内のファイルを通過しようとしていて、重複を見つけて削除しようとしています。私はディレクトリに29 000ファイルを持っているので、ブルートフォースを行うには1日以上かかるでしょう。現在のファイルのPythonループ

私は次のとおりであるファイル名を持っている:

「some_file_name」 「いくつかのファイル名」

だから1名にアンダースコアを持ち、他方はダッシュを持ち、時には彼らは2つのまたは3つのスポットです離れて。

どのようにして、内側ループがディレクトリ内の外側ループの位置から始まり、次の10個だけをチェックするようにしますか?

はここに私の強引なコードです:私はあなたの質問から理解して何から

import glob, os 
os.chdir("C:/Dir/dir") 

for file in glob.glob("*"): 
    temp = file 
    temp = temp.replace("-", " ") 
    temp = temp.replace("_", " ") 

#How do I start this loop where file is currently at and continue for the next 10 files 
for file2 in glob.glob("*"): 
    temp2 = file2 
    temp2 = temp2.replace("-", " ") 
    temp2 = temp2.replace("_", " ") 
    if temp == temp2: 
     os.remove(file2) 
+0

あなたはコンテンツまたは類似したことにより、重複するものを見つけたいと思います名前だけ? – Tomalak

+0

データ構造(セットまたはリスト)を使用して、すでに訪れたファイル名を追跡しようとしましたが、2回繰り返す(temp1とtemp2)というよりも、この方法では、各ファイルに1回だけループする必要があります。 – pills

答えて

3

、あなたはディレクトリから似た名前のファイルを削除します。私はあなたのアプローチ(「次の10のファイル名を見る」)があまりにも不正確で複雑すぎると思います。

ファイルsome_file_nameとファイルsome-file-nameの両方が存在する場合は、そのいずれかを削除します。

これは、ファイル名のリストを作成し、各エントリに対してダッシュの代わりにアンダースコアが付いたファイル名が存在するかどうかをチェックすることで非常に簡単に行うことができます。

以下はsetを使用しています。セットは非常に良好なルックアップ特性を持っています。すなわち、some_value in some_setはリストよりもはるかに高速です。また、セットを構築することで存在するすべてのファイルを既に知っているので、ファイルの存在を確認すること(コードos.path.isfile(file)など)を避けることもできます。

import glob, os 

filenames = {file for file in glob.glob(r"C:\Dir\dir\*")} 

for file in filenames: 
    delete_candidate = file.replace("-", "_") 
    if delete_candidate != file and delete_candidate in filenames: 
     os.remove(delete_candidate) 
     print("deleted " + delete_candidate) 

{x for x in iterable}セット理解あり、それは、値のリストから設定を構築します。それはリスト内包と同様に機能します。

+0

セット理解のために '{}'を使用すると、発電機 – Uriel

+0

が作成されました。もちろん。 – Tomalak

+0

ありがとう、私はちょっとばかげていると感じます。それは実際には非常に簡単な解決策ですが、それにもかかわらず、それは動作しますありがとう! – user3918910

0

あなたは辞書を使用し、「単純名」(_なしまたは - )を置くことができる値としてキーとすべての実ファイル名として:

import glob, os 

def extendDictValue(dDict, sKey, uValue): 
    if sKey in dDict: 
     dDict[sKey].append(uValue) 
    else: 
     dDict[sKey] = [uValue] 


os.chdir("C:/Dir/dir") 
filenames_dict = {} 
for filename in glob.glob("*"): 
    simple_name = filename.replace("-", " ").replace("_", " ") 
    extendDictValue(filenames_dict, simple_name, filename) 

for simple_name, filenames in filenames_dict.items(): 
    if len(filenames) > 1: 
     filenames.pop(0) 
     for filename in filenames: 
      os.remove(filename) 
関連する問題