0

フォルダー構造から MPTT を生成するためのこのアルゴリズムがあります: https://gist.github.com/unbracketed/946520

github で見つかり、私のニーズに完全に対応しています。現在、ツリー内のいくつかのフォルダーをスキップする機能を追加する必要があります。たとえば、/tmp/A/B1/C2 内/下のすべてをスキップしたい。したがって、私のツリーには C2 (C2 を含む) からは何も含まれません。

私はPythonでそれほど役に立たないので、そのクエリを作成しました(そして追加のリストを関数に渡しました):

def is_subdir(path, directory):
    path = os.path.realpath(path)
    directory = os.path.realpath(directory)
    relative = os.path.relpath(path, directory)
    return not relative.startswith(os.pardir + os.sep)

/Now we can add somewhere
for single in ignorelist:
    if fsprocess.is_subdir(node,single):

しかし、私の質問は、関数のどこに固執するかです。私はこれを一番上にしようとしましたが、if do returnでしたが、アプリケーション全体を終了しました。それ自体を繰り返し呼び出すので、かなり迷っています。

良いアドバイスはありますか?所有者のないgithubでスクリプト作成者に連絡してみました。このアルゴリズムは非常にうまく機能し、時間を大幅に節約でき、プロジェクトの要件に最適です。

4

1 に答える 1

0
def generate_mptt(root_dir):
    """
    Given a root directory, generate a calculated MPTT
    representation for the file hierarchy
    """
    for root, dirs, _ in os.walk(root_dir):

あなたの小切手はここにあるはずです:

        if any(is_subdir(root, path) for path in ignorelist):
           del dirs[:] # don't descend
           continue

みたいな。が のサブディレクトリである場合にそれis_subdir(root, path)が返されると仮定します。Truerootpath

        dirs.sort()
        tree[root] = dirs
    preorder_tree(root_dir, tree[root_dir])
    mptt_list.sort(key=lambda x: x.left)
于 2015-09-14T11:32:36.800 に答える