Saltar al contenido

Cómo copiar un fichero con Python

Cómo copiar un fichero con Python

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 tipo PathLike.
  • 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): Si follow_symlinks es falso y src es un enlace simbólico, dst se creará como un enlace simbólico. Si follow_symlinks es verdadero y src es un enlace simbólico, dst será una copia del archivo al que se refiere src.

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ónMantiene permisosCopia otros metadatosSoporta directorio como destinoAcepta objetos fichero
shutil.copyNoNo
shutil.copy2No
shutil.copyfileNoNoNoNo
shutil.copyfileobjNoNoNo