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 ?
Réponses
Trop de publicités?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é.
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)
- Réponses précédentes
- Plus de réponses