2017-02-27 3 views
1

CAD図面( ".dwg"、 ".dxf")をサブフォルダを持つソースディレクトリからコピー先ディレクトリにコピーし、元のディレクトリとサブフォルダ構造Python shutil copytree:特定のファイルタイプを維持するためにignore関数を使用する

  • 元のディレクトリ:H:\タンザニア... \ Bagamoyo_Single_line.dw​​g
  • ソースディレクトリ:H:\ CAD \タンザニア... \ Bagamoyo_Single_line.dw​​g

私は@martineauから次の答えを見つけました。投稿者:Python Factory Function

from fnmatch import fnmatch, filter 
from os.path import isdir, join 
from shutil import copytree 

def include_patterns(*patterns): 
    """Factory function that can be used with copytree() ignore parameter. 

    Arguments define a sequence of glob-style patterns 
    that are used to specify what files to NOT ignore. 
    Creates and returns a function that determines this for each directory 
    in the file hierarchy rooted at the source directory when used with 
    shutil.copytree(). 
    """ 
    def _ignore_patterns(path, names): 
     keep = set(name for pattern in patterns 
          for name in filter(names, pattern)) 
     ignore = set(name for name in names 
         if name not in keep and not isdir(join(path, name))) 
     return ignore 
    return _ignore_patterns 

# sample usage 

copytree(src_directory, dst_directory, 
     ignore=include_patterns('*.dwg', '*.dxf')) 

最終更新日:18:21予想通り、次のコードは、すでに機能ignore_patternが含まれているので、あなたドン、私はどのinclude_patterns(「の.dwg」、 『 .DXF』)

+0

コードはすでにそれを行う方法を実証していること。パターンを 'include_patterns'に渡し、戻り値は' copytree'に渡すコールバックです。 'copytree'は、ツリーを横断するときにパスと名前を結果の' _ignore_patterns'関数に渡す作業を行います。 – ShadowRanger

+0

こんにちは@ShadowRanger私は今、以下の仕組みを理解しています。 include_patternsに基づいて一致するものがあれば、ツリーをコピーするためだけに以下を修正して、空のディレクトリにならないように修正する必要があります。 –

答えて

6

shutilを含まないフォルダを無視したいことを除いて、動作しますあなた自身のものを提供しなければならない。ストレートdocumentationから:

from shutil import copytree, ignore_patterns 

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*')) 

これは何を説明するの.pycファイルとファイルまたは名前が始まりtmp.

とそれは(厳密にnecessairyなく)少しトリッキーだ ディレクトリ以外のすべてをコピーします関数の戻り値として_ignore_patternsを返します。この関数はパラメータとしてcopytreeに埋め込まれ、copytreeはこの関数を必要に応じて呼び出します。したがって、hav eこの関数を呼び出す方法を知っているか気にする_ignore_patterns。これは、不要なクラフトファイル(*.pycなど)をコピーしないように除外できることを意味します。関数_ignore_patternsの名前がアンダースコアで始まるという事実は、この関数が無視できるかもしれない実装の詳細であることを示唆しています。

copytreeは、フォルダdestinationがまだ存在しないと予想しています。 copytreeが動作し始めると、このフォルダとそのサブフォルダが存在することに問題はありません。copytreeは、その処理方法を知っています。

ここでinclude_patternsは反対を行うように書かれています:明示的に含まれていないものはすべて無視してください。しかし、それは同じように動作します:あなたはそれを呼び出す、それはボンネットの下の関数を返し、coptytreeは、その機能をどうするかを知っている:

copytree(source, destination, ignore=include_patterns('*.dwg', '*.dxf')) 
+0

こんにちは@Jan、次の関数は、保持したいファイル、つまりCAD( "* .dwg"、 "* .dxf")に基づいて動的無視リストを生成するため、他のすべてのファイルタイプは無視されます。私は次の作業をしています。私の最後のハードルはinclude_patterns( "* .dwg"、 "* .dxf")に基づいてファイルを持たないフォルダを除外することです。 –

+0

include_patternsメソッドはどこに定義されていますか? – AK47

+0

@ AK47 include_patternsはOPで定義されています。 – Jan