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_symlinks
es falso ysrc
es un enlace simbólico,dst
se creará como un enlace simbólico. Sifollow_symlinks
es verdadero ysrc
es un enlace simbólico,dst
será 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í |