2010-05-08 13 views
14

Si una ruta como b/c/ no existe en ./a/b/c, shutil.copy("./blah.txt", "./a/b/c/blah.txt") se quejará de que el destino no existe. ¿Cuál es la mejor manera de crear la ruta de destino y copiar el archivo a esta ruta?crear ruta de destino para archivos shutil.copy

Respuesta

17

Utilice os.makedirs para crear el árbol de directorios.

+3

usar 'os.makedirs (carpeta, exists_ok = True)' para cuando puede existir carpeta de destino. – Martlark

+2

Tenga en cuenta que la opción 'exists_ok' solo está presente en Python 3.2+ –

+7

Es' exist_ok', no 'exists_ok' – CharlesB

14

Uso algo similar a esto para verificar si el directorio existe antes de hacer cosas con él.

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

Por lo que sé, esto no funcionará en Python 2.7: OSError: [Errno 2] No such archivo o directorio: './a/b/c' – SummerBreeze

+1

Prefiero usar 'os.makedirs' en su lugar, lo que crearía directorios principales si no existieran. – feilong

+1

Tenga en cuenta que esto adolece de una condición de carrera (si alguien más u otro hilo crea el directorio entre el cheque y la llamada 'makedirs'). Es mejor llamar a 'os.makedirs' y atrapar la excepción si existe la carpeta. Compruebe SoF para la creación de directorio. – farmir

3

manera EAFP, evitar las razas y llamadas al sistema que no sean necesarios:

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) 
+0

Todavía hay una carrera si el directorio 'dest' se crea después de la llamada a' shutil.copy' pero antes de la llamada a 'os.makedirs'. – Lii

Cuestiones relacionadas