Si necesitas copiar un fichero con Python y no sabes cómo, has llegado al lugar indicado.
Cuando quieres copiar un fichero se pueden presentar varios escenarios: copiar solo el contenido, aceptar un directorio destino como parámetro, copiar metadatos, etc. Es por ello que Python ofrece diferentes alternativas a la hora de copiar un fichero. Veremos aquí las más comunes haciendo uso del módulo shutil.
Copiar un fichero en Python usando la función copy
copy es la función principal que debes usar si quieres copiar un fichero en Python. Como te decía, se encuentra definida dentro del módulo shutil. La principal característica de esta función es que copia el contenido del fichero y sus permisos, pero no copia otro tipo de metadatos como las fechas de creación y modificación originales.
¿Cómo funciona exactamente? Esta función define los siguientes parámetros:
src: Ruta completa o nombre del fichero origen. Puede ser un string o un objeto de tipoPathLike.dst: Ruta del fichero destino. Si la ruta es un directorio, se copiará el fichero origen en el directorio tomando como nombre el nombre del fichero original.follow_symlinks(por defecto,True): Sifollow_symlinkses falso ysrces un enlace simbólico,dstse creará como un enlace simbólico. Sifollow_symlinkses verdadero ysrces un enlace simbólico,dstserá una copia del archivo al que se refieresrc.
Veamos algunos ejemplos de uso:
import shutil
shutil.copy('origen.txt', 'destino.txt')
shutil.copy('/ruta/a/origen.txt', '/ruta/destino/copia.txt')
shutil.copy('/ruta/a/origen.txt', '/ruta/destino')Copiar los metadatos con copy2
Si adicionalmente necesitas copiar los metadatos de un fichero, puedes usar la función copy2. Esta función se comporta exactamente igual que la función copy del apartado anterior, con la diferencia de que también mantiene los metadatos del fichero original en el fichero destino.
import shutil
shutil.copy2('origen.txt', 'destino.txt')
shutil.copy2('/ruta/a/origen.txt', '/ruta/destino/copia.txt')
shutil.copy2('/ruta/a/origen.txt', '/ruta/destino')Copiar solo el contenido de un fichero
Cuando solo quieres copiar el contenido de un fichero, puedes hacer uso de la función copyfile(src, dst, follow_symlinks=True). Esta función hace una copia del fichero original src en el fichero destino dst.
Tanto src como dst son strings con las rutas completas de los ficheros origen y destino, respectivamente. Además, si el fichero destino ya existe, este será reemplazado.
Otra cosa a tener en cuenta de esta función es que se debe poder escribir en el destino, si no, se lanzará una excepción de tipo OSError.
import shutil
shutil.copyfile('origen.txt', 'destino.txt')
shutil.copyfile('/ruta/a/origen.txt', '/ruta/destino/copia.txt')Copiar el contenido de un fichero haciendo uso de objetos fichero
La última función que vamos a ver es copyfileobj. Esta función es similar a la anterior, solo que src y dst deben ser objetos de tipo fichero (no strings con las rutas origen/destino).
import shutil
file_src = 'source.txt'
f_src = open(file_src, 'rb')
file_dest = 'destination.txt'
f_dest = open(file_dest, 'wb')
shutil.copyfileobj(f_src, f_dest)Resumen de las funciones del módulo shutil
| Función | Mantiene permisos | Copia otros metadatos | Soporta directorio como destino | Acepta objetos fichero |
shutil.copy | Sí | No | Sí | No |
shutil.copy2 | Sí | Sí | Sí | No |
shutil.copyfile | No | No | No | No |
shutil.copyfileobj | No | No | No | Sí |
