7

これは Python のドキュメントからの抜粋です。

exclude が指定されている場合、それは 1 つのファイル名引数を取り、ブール値を返す関数でなければなりません。この値に応じて、それぞれのファイルが除外 (True) または追加 (False) されます。

私はそれが何を意味するのか分からないことを認めなければなりません。

さらに:

バージョン 2.7 以降非推奨: exclude パラメータは非推奨です。代わりに filter パラメータを使用してください。移植性を最大限に高めるには、filter を位置引数としてではなく、キーワード引数として使用して、exclude が最終的に削除されたときにコードが影響を受けないようにする必要があります。

わかりました...そして「フィルター」の定義:

filter が指定されている場合、それは TarInfo オブジェクトの引数を取り、変更された TarInfo オブジェクトを返す関数でなければなりません。代わりに None を返す場合、TarInfo オブジェクトはアーカイブから除外されます。

... 振り出しに戻って :)

私が本当に必要としているのは、除外の配列 (または ":" で区切られた文字列) を tarfile.add に渡す方法です。

PyDocs ment からのそれらのパッセージが何を説明しようとしてもかまいません。

PS:

これは私の頭をよぎりました:

  • ソース ディレクトリ コンテンツのリストの配列を作成する
  • ポッピングは除外します
  • 残っている個々の配列メンバーに対して tar.add を実行する

でも、もっと文化的な方法でやってほしい

4

1 に答える 1

19

exclude が指定されている場合、それは 1 つのファイル名引数を取り、ブール値を返す関数でなければなりません。この値に応じて、それぞれのファイルが除外 (True) または追加 (False) されます。

たとえば、文字「a」で始まるすべてのファイル名を除外する場合は、次のようにします...

def exclude_function(filename):
    if filename.startswith('a'):
        return True
    else:
        return False

mytarfile.add(..., exclude=exclude_function)

あなたの場合、次のようなものが必要です...

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

def exclude_function(filename):
    if filename in EXCLUDE_FILES:
        return True
    else:
        return False

mytarfile.add(..., exclude=exclude_function)

...これは...に減らすことができます

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

mytarfile.add(..., exclude=lambda x: x in EXCLUDE_FILES)

アップデート

TBH、非推奨の警告についてはあまり心配しませんが、新しいfilterパラメーターを使用する場合は、次のようなものが必要になります...

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

def filter_function(tarinfo):
    if tarinfo.name in EXCLUDE_FILES:
        return None
    else:
        return tarinfo

mytarfile.add(..., filter=filter_function)

...これは...に減らすことができます

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
于 2013-04-14T15:46:34.473 に答える