2

shutil.copytree() を呼び出すときに、無視できるファイルとディレクトリへのフル パスを指定したいと思います。何かのようなもの

def my_ignore(dir, files):

    # return ["exclude.file"] # working

    return ["/full_path_to/exclude.file"] # Not working

shutil.copytree(src, dest, ignore=my_ignore)

この後、フルパスではなくファイル名だけを返さない限り、除外されたファイルはまだそこにあります。問題は、異なるディレクトリの下にあるすべての一致するファイル名ではなく、特定のファイルを設定したいということです。

ここでは、次のような多くの質問を参照しました

shutil.copytree を使用するときにディレクトリをフィルタリングしますか?

しかし、どれもうまくいきません。ignore フックはグロブ スタイルのみを返すことができ、構築されたフル パスは機能しないようです。

何か不足していますか?

4

2 に答える 2

1

ignore実際、無視されたファイル名だけを返さなければなりません。ただし、関数はディレクトリにアクセスするたびに呼び出されshutil.copytree()ます。ディレクトリごとにファイルを無視できます。

無視する必要があるファイルへのフル パスがある場合は、関数に渡された最初のパラメーターと照合しますignore。そのディレクトリへのフル パスです。

def my_ignore(dir, files):
    if dir == '/full_path_to':
        return {"exclude.file"}

ここでセットを返します。セット メンバーシップのテストは、リストよりも高速です。

無視する定義済みの一連のパスがある場合は、それらを辞書に解析します。キーはディレクトリ パス、値はそのパス内のファイル名のセットです。

from collections import defaultdict

to_ignore = defaultdict(set)
for path in ignored_paths:
    dirname, filename = os.path.split(path)
    to_ignore[dirname].add(filename)

def my_ignore(src, files):
    return to_ignore.get(src, set())
于 2013-07-09T17:49:06.167 に答える
1

それは魔法ではありません。copytree()一度に1つのディレクトリの内容をコピーし、返された無視リストでファイル名を具体的に探します。フル パスは決してファイルの名前ではないため、一致することはありません。

ただし、dirパラメーターは、必要なことを行うのに役立ちます。

def my_ignore(dir, files):
    if dir == "/full/path/to":
        return ["exclude.file"]
    else:
        return []
于 2013-07-09T17:50:09.530 に答える