Python parece tener funciones para copiar archivos (por ejemplo shutil.copy
) y funciones para copiar directorios (por ejemplo shutil.copytree
), pero no he encontrado ninguna función que maneje ambos. Claro, es trivial comprobar si desea copiar un archivo o un directorio, pero parece una extraña omisión.
¿Realmente no existe una función estándar que funcione como el cp -r
comando de Unix , es decir, que admita directorios y archivos y realice copias de forma recursiva? ¿Cuál sería la forma más elegante de solucionar este problema en Python?
copytree
copiar un solo archivo?Respuestas:
Le sugiero que primero llame
shutil.copytree
y, si se lanza una excepción, vuelva a intentarlo conshutil.copy
.fuente
shutil.copytree
función mejore y gestione ambos casos en el futuro. 4) Las excepciones no son tan excepcionales en Python; por ejemplo, una iteración se detiene lanzando una excepción StopIteration.Para agregar las respuestas de Tzot y gns , aquí hay una forma alternativa de copiar archivos y carpetas de forma recursiva. (Python 3.X)
Si es tu primera vez y no tienes idea de cómo copiar archivos y carpetas de forma recursiva, espero que esto te ayude.
fuente
shutil.copy
yshutil.copy2
están copiando archivos.shutil.copytree
copia una carpeta con todos los archivos y todas las subcarpetas.shutil.copytree
está utilizandoshutil.copy2
para copiar los archivos.Entonces, lo análogo a lo
cp -r
que estás diciendo esshutil.copytree
porquecp -r
apunta y copia una carpeta y sus archivos / subcarpetas comoshutil.copytree
. Sin los-r
cp
archivos de copias comoshutil.copy
yshutil.copy2
hacer.fuente
shutil.copytree('C:\myfile.txt', 'C:\otherfile')
. No funciona. Eso es lo que preguntaba el OP ... hace 7 años.Unix
cp
no 'admite tanto directorios como archivos':Para hacer que cp copie un directorio, debe decirle manualmente a cp que es un directorio, usando el indicador '-r'.
Sin embargo, hay algo de desconexión aquí:
cp -r
cuando se le pasa un nombre de archivo, la fuente copiará felizmente solo el archivo; copytree no lo hará.fuente
Creo que copy_tree es lo que estás buscando.
fuente
El método python shutil.copytree es un desastre. He hecho uno que funciona correctamente:
fuente