2017-02-27 4 views
1

J'essaie de comprendre comment copier des dessins CAO (« .dwg », » .dxf) à partir d'un répertoire source des sous-dossiers dans un répertoire de destination et le maintien de la répertoire d'origine et la structure des sous-dossiersPython shutil copytree: utilisez ignorer fonction pour conserver les fichiers spécifiques types

  • Répertoire d'origine:. H: \ Tanzanie ... \ Bagamoyo_Single_line.dwg
  • Source Répertoire: H: \ CAD \ Tanzanie ... \ Bagamoyo_Single_line.dwg

J'ai trouvé la réponse suivante de @martineau dans le foll poste vu: 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')) 

Mise à jour: 18h21. Le code suivant fonctionne comme prévu, sauf que je voudrais ignorer les dossiers qui ne contiennent pas de include_patterns (« .dwg », « .dxf »)

+0

Ce code est déjà montrant comment le faire. Vous passez les modèles à 'include_patterns', et le retour est un callback que vous passez à' copytree'. 'copytree' fait le travail de passer des chemins et des noms à la fonction' _ignore_patterns' résultante comme elle traverse l'arbre. – ShadowRanger

+0

Salut @ShadowRanger Je comprends maintenant comment cela fonctionne. Je dois modifier le suivant seulement pour copier l'arbre s'il y a une correspondance basée sur mes include_patterns pour que je ne finisse pas avec des répertoires vides. –

Répondre

6

shutil contient déjà une fonction ignore_pattern, de sorte que vous don Je n'ai pas à fournir les vôtres. Droit de la documentation:

from shutil import copytree, ignore_patterns 

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

Cela copiera tout sauf .pyc fichiers et les fichiers ou répertoires dont le nom commence par tmp.

Il est un peu difficile (et non strictement necessairy) pour expliquer ce qui est passe: ignore_patterns retourne une fonction _ignore_patterns comme sa valeur de retour, cette fonction est bourrée dans copytree en tant que paramètre, et copytree appelle cette fonction comme nécessaire, de sorte que vous n'avez pas e savoir ou se soucier comment appeler cette fonction _ignore_patterns. Cela signifie simplement que vous pouvez exclure certains fichiers cruels inutiles (tels que *.pyc) d'être copiés. Le fait que le nom de la fonction _ignore_patterns commence par un trait de soulignement indique que cette fonction est un détail d'implémentation que vous pouvez ignorer.

copytree s'attend à ce que le dossier destination n'existe pas encore. Ce n'est pas un problème que ce dossier et ses sous-dossiers apparaissent une fois que copytree commence à fonctionner, copytree sait comment gérer cela.

maintenant include_patterns est écrit à faire le contraire: ignorer tout ce qui ne sont pas explicitement inclus. Mais cela fonctionne de la même façon: vous appelez juste, il retourne une fonction sous le capot, et coptytree sait quoi faire avec cette fonction:

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

Salut @Jan, la fonction suivante est de générer une liste d'ignorés dynamiques basée sur les fichiers que je veux garder, c'est-à-dire CAD ("* .dwg", "* .dxf"), donc tous les autres types de fichiers sont ignorés. J'ai le travail suivant, mon dernier obstacle est d'exclure les dossiers qui n'ont pas de fichiers en leur sein sur la include_patterns ("*. Dwg", "* .dxf"). –

+0

Où la méthode include_patterns est-elle définie? – AK47

+0

@ AK47 include_patterns est défini dans l'OP. – Jan