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

Estoy intentando copiar un directorio y todos sus contenidos a 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 hacerlo. la función shutil.copytree() espera que la ruta de destino no exista de antemano.

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

distutils.dir_util.copy_tree hace lo que quieres.

Copie un src de árbol de directorio completo a una nueva ubicación dst. Tanto src como dst deben ser nombres de directorio. Si src no es un directorio, genere DistutilsFileError. Si dst no existe, se crea con mkpath (). El resultado final de la copia es que cada archivo en src se copia en dst, y los directorios en src se copian recursivamente en dst. Devuelva la lista de archivos que se copiaron o podrían haberse copiado, usando su nombre de salida. El valor de retorno no se ve afectado por update o dry_run: es simplemente la lista de todos los archivos bajo src, con los nombres cambiados para estar bajo dst.

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

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

Para operaciones de archivos de alto nivel, utilice el módulo shutil y, en su caso, la función copytree. Creo que eso es más limpio que “abusar” de los distritos.

ACTUALIZACIÓN:: Olvídese de la respuesta, pasé por alto que el OP probó shutil.

¿Está recibiendo el error que dice “No se puede crear un directorio cuando ya está presente”? No estoy seguro de lo tonto que es esto, pero todo lo que hice fue insertar una sola línea en el módulo de 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 un bluder. Si es así, ¿podría alguien señalarme eso? Lo siento, soy muy nuevo en python: P