2009-02-04 12 views
32

Estoy intentando 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. la función shutil.copytree() espera que la ruta de destino no exista previamente.¿Cómo copiar un directorio y su contenido a una ubicación existente usando Python?

El resultado exacto que estoy buscando es copiar una estructura de carpetas completa sobre 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.

Respuesta

42

distutils.dir_util.copy_tree hace lo que quiere.

Copy an entire directory tree src to a new location dst. Both src and dst must be directory names. If src is not a directory, raise DistutilsFileError. If dst does not exist, it is created with mkpath(). The end result of the copy is that every file in src is copied to dst, and directories under src are recursively copied to dst. Return the list of files that were copied or might have been copied, using their output name. The return value is unaffected by update or dry_run: it is simply the list of all files under src, with the names changed to be under dst.

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

+1

No he visto este antes, buen descubrimiento. Mi única advertencia es que no indica qué archivos se sobrescribieron y cuáles se crearon de nuevo. Mientras que eso no sea un requisito, sin embargo, esto se ve perfecto. –

+0

Este es uno bueno, aunque requerirá que distutils esté instalado. No es un gran problema ya que estamos agrupando esto en un EXE con pyinstaller de todos modos. – Soviut

+0

distutils es parte de la biblioteca estándar, por lo que debería, en teoría, estar siempre instalado. –

0

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

+5

eso es lo que estaba considerando, pero quería asegurarme de que no estaba reinventando la rueda. – Soviut

0

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

ACTUALIZACIÓN:: Olvidé la respuesta, pasé por alto que el OP intentó el shutil.

+1

Mencioné en mi pregunta que shutil.copytree() es lo que estaba tratando de usar pero no se ajusta a la factura. – Soviut

+1

Normalmente estaría de acuerdo con esto, pero no hace exactamente lo que pidió el O.P. –

+1

Ustedes tienen razón, pasé por alto que en la pregunta, era demasiado tarde esa noche :-) –

0

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

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

en:

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

supongo que he hecho un poco bluder. Si es así, ¿podría alguien señalarme eso? Lo siento, soy muy nuevo en Python: P

Cuestiones relacionadas