2016-11-15 11 views
0

基本構造を持つアプリケーションによって作成されたディレクトリがあります。ディレクトリパターンの確認Python

G009832 
    - SearchData 
     _SearchDb_ 
     _SearchDb_.dbsync 
    - WaveformCache 
     file1.wcf 
     file2.wcf 
    ProjectNameFile.apf 
    ProjectNameSettings.xml 
    ProjectNameSettingsBinary.abf 

このフォルダとファイルの構造はかなり一定である、唯一の変数は、マシン名でルートフォルダ名、およびWaveformCacheフォルダに存在する* .wcf波形キャッシュファイルの量です。

ユーザーが削除する前に、これらのフォルダまたはサブフォルダに追加のコンテンツを追加していないことを確認したいと思います。

現時点では、各フォルダの内容をos.walkで確認しています。

illegal = [] 
if IsMachineFormatted(folder): # Function that checks folder is machine folder. 
    for root, dirs, files in os.walk(folder): 
     for f in files: 
      if f == '_SearchDb_': 
       pass 
      elif f == '_SearchDb_.dbsync': 
       pass 
      elif f.endswith('.wcf'): 
       pass 
      elif f.endswith('.apf'): 
       pass 
      elif f.endswith('.xml'): 
       pass 
      elif f.endswith('.abf'): 
       pass 
      else: 
       illegal.append(f) 
else: 
    pass 

これはokですし、違法なファイルのリストを返しますが、それは非常にエレガントではありません、それはなどの余分なディレクトリをチェックしません。また、.x​​mlファイルの任意の数またはその他の許可タイプを許可しますのファイルを介して。

私はこのコードを改善する前に、これを行うより良い方法があると確信しています。

私はPythonのディレクトリの比較演算子を認識していません。デフォルトのディレクトリパターンに追加された余分なファイルとフォルダの構造を含む辞書のリストのようなものを返すことができます。例えば。

difference = [{'FolderName':['Naughty.txt','illegal.etc'],{'Disobedience':['Here.txt','AndHere.txt']}] 
+0

私はデータ構造にディレクトリ構造(またはそれの表現)を読むことから始めます。あなたの有効なディレクトリ構造に似たデータ構造を作成すると、問題は、2つの異なるツリーのノードを比較して子供たちを再帰させる非常に単純な関数になります。 – thebjorn

+0

私はそれをすることができましたが、かなり冗長であるようです。私は1つのライナーのラインに沿ってもっと考えていました - root、dir、os.walk(path)のファイル:dirまたはパターンではないファイル:エラーを返す - しかし、私はいくつかのディレクトリにさまざまな量のファイルを持っています。 – Xeberdee

+0

私はそれが既存のソリューションよりはるかに冗長ではなく、はるかに柔軟性があるとは思わない。別の考え方は、ディレクトリ構造と有効な構造体の複数行文字列バージョンを生成し、次にdifflibを使用してdiffを生成することです。 – thebjorn

答えて

0

コードを少し書き直しました。 anyでよりエレガントにすることはできますが、効果はそれほど効果的ではありません(すべての端をチェックする必要があるため)。 errorについての質問が間違った構文で与えられたため、私はあなたの質問が正しく得られたかどうかはわかりません。

また、私はネスト5つのステップを避けるために、関数にこのコードを破ることをお勧めします:

from collections import defaultdict 

ALLOWED_NAMES = ['_SearchDb_', '_SearchDb_.dbsync'] 
ALLOWED_ENDS = ['.wcf', '.apf', '.xml', '.abf'] 

def ends_with_any(word, ends): 
    for end in ends: 
     if word.endswith(end): 
      return True 
    return False 

def is_legal_name(filename, allowed_names, allowed_ends): 
    return filename in allowed_names or ends_with_any(f, allowed_ends) 

illegal = defaultdict(list) 
if IsMachineFormatted(folder): # Function that checks folder is machine folder. 
    for dirpath, dirs, files in os.walk(folder): 
     for f in files: 
      if not is_legal_name(f, ALLOWED_NAMES, ALLOWED_ENDS): 
       illegal[dirpath].append(f) 
+0

ありがとうバレンタイン。私は関数をdefに変更し、fはis_legal_nameに渡されません - それは 'ファイル名'ですが、動作していて、私が行っていたよりも優れています。 – Xeberdee

+0

ああ、申し訳ありません - あまりにも多くのJS最近:-)編集。 –

+0

「エラー」を「差異」に変更して、問題をよりよく読むようにしました。私は、有効な構造と無効な構造の違いをエラーと考えていました。 – Xeberdee

関連する問題