32 votes

Comment copier un répertoire et son contenu dans un emplacement existant en utilisant Python ?

J'essaie de copier un répertoire et tout son contenu dans un chemin qui existe déjà. Le problème est qu'entre le module os et le module shutil, il ne semble pas y avoir de moyen d'y parvenir. le shutil.copytree() s'attend à ce que le chemin de destination n'existe pas au préalable.

Le résultat exact que je recherche est de copier une structure de dossiers entière par-dessus une autre, en écrasant silencieusement tous les doublons trouvés. Avant de me lancer dans l'écriture de ma propre fonction, j'ai pensé que je pourrais demander si quelqu'un connaît une recette ou un snippet existant qui fait cela.

42voto

Ali Afshar Points 22836

distutils.dir_util.copy_tree fait ce que vous voulez.

Copie une arborescence entière de répertoires src vers un nouvel emplacement dst. src et dst doivent être des noms de répertoires. Si src n'est pas un répertoire, la commande DistutilsFileError est lancée. Si dst n'existe pas, il est créé avec mkpath(). avec mkpath(). Le résultat final de la copie est que chaque fichier de src est est copié dans dst, et les répertoires sous src sont récursivement copiés vers dst. Retourne la liste des fichiers qui ont été copiés ou qui pourraient avoir été copiés, en utilisant leur nom de sortie. La valeur de retour n'est pas affectée par update ou dry_run : c'est simplement la liste de tous les fichiers fichiers sous src, avec les noms noms modifiés pour être sous dst.

(plus de documentation à l'url ci-dessus)

0voto

Est-ce que vous obtenez l'erreur qui dit "Impossible de créer un répertoire quand il est déjà présent" ? Je ne sais pas si c'est vraiment stupide, mais tout ce que j'ai fait, c'est d'insérer une seule ligne dans le module copytree : J'ai changé :

def copytree(src, dst, symlinks=False):
    names = os.listdir(src)
    os.makedirs(dst)

dans :

def copytree(src, dst, symlinks=False):
    names = os.listdir(src)
    if (os.path.isdir(dst)==False):
        os.makedirs(dst)       

Je suppose que j'ai fait du bluder. Si c'est le cas, quelqu'un pourrait-il me le signaler ? Désolé, je suis très novice en python :P

0voto

André Points 4833

Pour les opérations de haut niveau sur les fichiers, utilisez la commande shutil et dans votre cas, la fonction copytree. Je pense que c'est plus propre que d'"abuser" des distutils.

UPDATE : : Oubliez la réponse, j'ai négligé le fait que le PO a essayé shutil.

0voto

Swaroop C H Points 7518

Pourquoi ne pas le mettre en œuvre vous-même en utilisant os.walk ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X