7
votes

(Distutil + Shuttil) * Copytree =?

J'aimerais que le modèle Ignorer la fonction CopyTree de Shuttil fournit. Et je veux que l'arbre SRC remplace tous les fichiers / dossiers existants dans le répertoire Dest, comme Distutil.dir_util.copy_tree.

Je suis un utilisateur de Python assez neuf et je ne peux pas sembler trouver des messages à ce sujet.


7 commentaires

Intéressant. Et quelle est votre question?


Quel est le sens de la vie? Hehe jk.


J'aimerais utiliser une fonction d'arborescence de copie qui remplace les fichiers / répertoires existants et peut prendre un motif ignoré. Les fermetures et les distutilles ont chacune la moitié des fonctionnalités que je veux.


Et qu'en est-il d'utiliser shuttil.copytree, mais en supprimant le répertoire de destination?


Ce serait génial s'il n'y avait pas de fichiers dans l'annuaire DESTS, je voulais persister.


Si vous souhaitez affiner votre question, veuillez modifier votre message au lieu de fournir ces informations sur le formulaire de commentaires.


Il semble que la philosophie Unix d'avoir un outil qui rend une chose vraiment bonne ne s'applique pas à la copie de répertoires avec Python. On peut écraser, l'autre peut ignorer les motifs. Aucun ne peut tous les deux. Je veux rsync pour Python !!!


4 Réponses :


3
votes

J'allais dire ce bien sûr mais je n'ai pas fait. http://docs.python.org/library/shutil.html a une version de la fonction COPHTREEE. Je l'ai examiné pour voir si cela remplacerait simplement les fichiers existants et de ce que je pouvais dire, il écraserait les fichiers existants, mais il échoue si l'un des répertoires existait déjà. En raison de OS.MKDIRS CODE> Échec de l'échec si les répertoires existent déjà.

Les importations nécessaires: p> xxx pré>

prise _mkdir code> de http://code.activestate.com/recipes/82465-Allicy -MKDIR / (un commentateur là-bas mentionne que OS.MKDirs code> a la plupart du même comportement mais ne remarque pas que _mkdir code> n'échoue pas le cas échéant. des répertoires à faire déjà exister) p> xxx pré>

Bien que cela ne prend pas un argument code> comme OS.MKDIRS code >, copytree code> n'utilise pas cela, donc ce n'est pas nécessaire. p>

puis change copytree code> pour appeler _mkdir code> Au lieu de OS.MKDIRS CODE>: P>

def copytree(src, dst, symlinks=False):
    """Recursively copy a directory tree using copy2().

    The destination directory must not already exist.
    If exception(s) occur, an Error is raised with a list of reasons.

    If the optional symlinks flag is true, symbolic links in the
    source tree result in symbolic links in the destination tree; if
    it is false, the contents of the files pointed to by symbolic
    links are copied.

    XXX Consider this example code rather than the ultimate tool.

    """
    names = os.listdir(src)
    # os.makedirs(dst)
    _mkdir(dst) # XXX
    errors = []
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks)
            else:
                shutil.copy2(srcname, dstname)
            # XXX What about devices, sockets etc.?
        except (IOError, os.error), why:
            errors.append((srcname, dstname, str(why)))
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error, err:
            errors.extend(err.args[0])
    try:
        shutil.copystat(src, dst)
    except WindowsError:
        # can't copy file access times on Windows
        pass


0 commentaires

1
votes

Il suffit de prolonger la réponse de Dan en incorporant l'argument ignoré et en ajoutant du shottilis à la classe "Erreur" (pour Copytree):

def copytree(src, dst, symlinks=False, ignore=None):
    """Recursively copy a directory tree using copy2().

    The destination directory must not already exist.
    If exception(s) occur, an Error is raised with a list of reasons.

    If the optional symlinks flag is true, symbolic links in the
    source tree result in symbolic links in the destination tree; if
    it is false, the contents of the files pointed to by symbolic
    links are copied.

    XXX Consider this example code rather than the ultimate tool.

    """
    names = os.listdir(src)
    if ignore is not None:
        ignored_names = ignore(src, names)
    else:
        ignored_names = set()

    _mkdir(dst) # XXX
    errors = []
    for name in names:
        if name in ignored_names:
            continue
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks, ignore)
            else:
                shutil.copy2(srcname, dstname)
            # XXX What about devices, sockets etc.?
        except (IOError, os.error), why:
            errors.append((srcname, dstname, str(why)))
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except shutil.Error, err:
            errors.extend(err.args[0])
    try:
        shutil.copystat(src, dst)
    except WindowsError:
        # can't copy file access times on Windows
        pass


0 commentaires

1
votes

Ceci est un wokarant avec les deux distunes et la fermeture: xxx

Remarque: il ne s'agit pas d'une méthode efficace, car elle copie les mêmes fichiers deux fois.


0 commentaires