Pregunta ¿Cómo copiar un directorio y su contenido a una ubicación existente usando Python?


Intento copiar un directorio y todos sus contenidos en una ruta que ya existe. El problema es que, entre el módulo os y el módulo shutil, no parece haber una manera de hacer esto. el shutil.copytree() función espera que la ruta de destino no exista de antemano.

El resultado exacto que estoy buscando es copiar una estructura de carpeta completa encima de otra, sobrescribiendo silenciosamente cualquier duplicado encontrado. Antes de saltar y comenzar a escribir mi propia función para hacer esto, pensé que podría preguntar si alguien sabe de una receta existente o un fragmento que hace esto.


32
2018-02-04 16:41


origen


Respuestas:


distutils.dir_util.copy_tree hace lo que quieres

Copie un árbol de directorios completo src a un   nueva ubicación dst. Tanto src como dst   deben ser nombres de directorio. Si src no es   un directorio, eleve DistutilsFileError.   Si dst no existe, se crea   con mkpath (). El resultado final de la   copia es que cada archivo en src es   copiado a dst, y directorios bajo   src se copian recursivamente a dst.   Devuelve la lista de archivos que fueron   copiado o podría haber sido copiado,   usando su nombre de salida. El regreso   el valor no se ve afectado por la actualización o   dry_run: es simplemente la lista de todos   archivos bajo src, con los nombres   cambiado para estar bajo dst.

(más documentación en la url anterior)


42
2018-02-04 17:03



¿Por qué no implementarlo por su cuenta? os.walk?


0
2018-02-04 16:56



Para operaciones de archivos de alto nivel como esa, use el shutil módulo y en su caso la función copytree. Creo que es más limpio que "abusar" de los distutils.

ACTUALIZAR:: Olvidé la respuesta, pasé por alto que el OP sí intentó el shutil.


0
2018-02-04 22:06



¿Estás obteniendo el error que dice "No se puede crear un directorio cuando ya está presente"? No estoy seguro de cuán tonto es esto, pero todo lo que hice fue insertar una sola línea en el módulo copytree: Cambié :

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

dentro:

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

Supongo que hice algo de bluder. Si es así, ¿podría alguien señalarme eso? Lo siento, soy muy nuevo en Python: P


0
2018-03-05 16:08