118 votes

créer un chemin de destination pour les fichiers shutil.copy

Si un chemin tel que b/c/ n'existe pas dans ./a/b/c , shutil.copy("./blah.txt", "./a/b/c/blah.txt") se plaindra que la destination n'existe pas. Quelle est la meilleure façon de créer le chemin de destination et de copier le fichier dans ce chemin ?

145voto

7yl4r Points 1033

Pour résumer les informations contenues dans les réponses et les commentaires :

Pour python 3.2+ :

os.makedirs avant copy avec exist_ok=True :

os.makedirs(os.path.dirname(dest_fpath), exist_ok=True)
shutil.copy(src_fpath, dest_fpath)

Pour python < 3.2 :

os.makedirs après avoir attrapé le IOError et réessayez de copier :

try:
    shutil.copy(src_fpath, dest_fpath)
except IOError as io_err:
    os.makedirs(os.path.dirname(dest_fpath))
    shutil.copy(src_fpath, dest_fpath)

Bien que vous puissiez être plus explicite en ce qui concerne la vérification errno et/ou vérifier si le chemin exists avant makedirs Selon moi, ces extraits représentent un bon équilibre entre la simplicité et la fonctionnalité.

42voto

Philipp Points 21479

Utilice os.makedirs pour créer l'arborescence.

31voto

thegrinner Points 4638

J'utilise quelque chose de similaire pour vérifier si le répertoire existe avant de faire des choses avec.

if not os.path.exists('a/b/c/'):
    os.mkdir('a/b/c')

23voto

Mr_and_Mrs_D Points 4569

Il s'agit de la FEPA ce qui permet d'éviter les courses et les appels de service inutiles :

import errno
import os
import shutil

src = "./blah.txt"
dest = "./a/b/c/blah.txt"
# with open(src, 'w'): pass # create the src file
try:
    shutil.copy(src, dest)
except IOError as e:
    # ENOENT(2): file does not exist, raised also on missing dest parent dir
    if e.errno != errno.ENOENT:
        raise
    # try creating parent directories
    os.makedirs(os.path.dirname(dest))
    shutil.copy(src, dest)

12voto

johnson Points 630

Pour les versions 3.4/3.5+, vous pouvez utiliser pathlib :

Path.mkdir(mode=0o777, parents=False, exist_ok=False)


Ainsi, s'il y a plusieurs répertoires à créer et s'ils existent déjà :

pathlib.Path(dst).mkdir(parents=True, exist_ok=True)

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