0

一連の監視ディレクトリからファイルをバックアップする python プログラムを作成しています。ファイル システムの変更を検出するために Watchdog を使用しています。表示されるのは、変更されたファイルとフォルダーのリストだけです。

アプリケーションには、フォルダーリストを含めたり除外したりするオプションがありますが、パスを一致させて除外するか含めるかを確認する方法がわかりません。

問題は、ツリーがあり、ユーザーが除外されたフォルダー内にあるフォルダーを含めることを選択した場合です。

サンプル ファイル ツリー

/folder1/folder2/folder3/folder4/folder5

含む

/folder1
/folder1/folder2/folder3/folder4

除外

/folder1/folder2

ウォッチドッグによって返された文字列のパス セクションの開始を比較するために startswith() を使用することを考えましたが/folder1/folder2/folder3/folder4/folder5、インクルード フォルダー リストとエクスクルード フォルダー リストで一致します。

誰かがこれにアプローチするための最良の方法を提案できれば、私は非常に感謝しています. os.walk を使用してディレクトリを再帰的に処理していれば、簡単に機能させることができましたが、リストが与えられただけでは、その方法がわかりません。それは私を夢中にさせます。

4

3 に答える 3

1

あなたの言っていることが理解できれば、最もネストされた深さを優先したいのです。'/folder1/folder2/folder3/folder4/folder5が含まれています。

次のようなルックアップ テーブルにデータを取得します。

lookup = {'/folder1/folder2/folder3/folder4':'include','/folder1/folder2':'exclude','/folder1':'include'}

次に、クエリを逆の順序でループし、一致するまで一度に 1 つのディレクトリを削除します。

folder = '/folder1/folder2/folder3/folder4/folder5'.split('/')
for i in reversed(range(len(folder) + 1)):
    check = '/'.join(folder[:i])
    if lookup.get(check):
        print('{}: {}'.format(check,lookup.get(check)))
        break

#/folder1/folder2/folder3/folder4: include
于 2013-10-31T21:42:14.710 に答える
0

別の可能性として、特定のパスに適用する必要があるアクション (つまり、包含または除外) が最も具体的です。したがって、構成を次のような構造に配置することで、問題に取り組むことができます。

rules = [("/folder1", "include"), ("/folder1/folder2/...", "exclude"), ...]

次に、次のような関数を使用して、特定のパスに適用するアクションを決定できます。

def get_action(path, rules):
    action = None
    depth = None
    for filter, filter_action in rules:
        if path.startswith(filter):
            filter_depth = filter.count(os.sep)
            if depth is None or filter_depth > depth:
                depth = filter_depth
                action = filter_action
    return action

これにより、アクション、つまり「含める」または「除外する」、またはパスにルールが定義されていない場合が返されますNone。私が示した定義はかなり非効率的であり、改善できる方法はたくさんありますが、基本的な考え方は、特定のパスに対して最も具体的なルールを探し、そのアクションに従うことです。

于 2013-10-31T22:42:22.707 に答える