Python semble avoir des fonctions pour copier des fichiers (par exemple shutil.copy
) et des fonctions pour copier des répertoires (par exemple shutil.copytree
) mais je n'ai trouvé aucune fonction qui gère les deux. Bien sûr, il est trivial de vérifier si vous souhaitez copier un fichier ou un répertoire, mais cela semble être une étrange omission.
N'existe-t-il pas vraiment de fonction standard qui fonctionne comme la cp -r
commande unix , c'est-à-dire qui prend en charge à la fois les répertoires et les fichiers et les copie récursivement? Quelle serait la manière la plus élégante de contourner ce problème en Python?
copytree
de copier un seul fichier?Réponses:
Je vous suggère d'appeler d'abord
shutil.copytree
, et si une exception est levée, réessayez avecshutil.copy
.la source
shutil.copytree
fonction d'améliorer et de gérer les deux cas à l'avenir. 4) Les exceptions ne sont pas si exceptionnelles en Python; Par exemple, une itération s'arrête en lançant une exception StopIteration.Pour ajouter les réponses de Tzot et gns , voici une autre façon de copier des fichiers et des dossiers de manière récursive. (Python 3.X)
Si c'est votre première fois et que vous ne savez pas comment copier des fichiers et des dossiers de manière récursive, j'espère que cela vous aidera.
la source
shutil.copy
etshutil.copy2
copient des fichiers.shutil.copytree
copie un dossier avec tous les fichiers et tous les sous-dossiers.shutil.copytree
utiliseshutil.copy2
pour copier les fichiers.Donc, l'analogue que
cp -r
vous dites est leshutil.copytree
parce quecp -r
cible et copie un dossier et ses fichiers / sous-dossiers commeshutil.copytree
. Sans les-r
cp
copies de fichiers commeshutil.copy
etshutil.copy2
faire.la source
shutil.copytree('C:\myfile.txt', 'C:\otherfile')
. Ça ne marche pas. C'est ce que le PO demandait ... il y a 7 ans.Unix
cp
ne `` prend pas en charge à la fois les répertoires et les fichiers '':Pour que cp copie un répertoire, vous devez indiquer manuellement à cp qu'il s'agit d'un répertoire, en utilisant l'indicateur '-r'.
Il y a cependant une certaine déconnexion ici - une
cp -r
fois passé un nom de fichier, la source copiera volontiers le seul fichier; copytree ne le fera pas.la source
Je pense que copy_tree est ce que vous recherchez
la source
La méthode python shutil.copytree est un gâchis. J'en ai fait un qui fonctionne correctement:
la source