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

¿Quieres ser expert@ en Python? Recibe trucos Python y las últimas novedades del blog

¡Eyyy! Esto también te puede interesar 👇

* Te informo de que los datos de carácter personal que proporciones al comentar serán tratados por Juan José Lozano Gómez como responsable de esta web. La Finalidad es moderar los comentarios. La Legitimación es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en Disqus (disqus.com), mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos enviando un email a juanjo@j2logo.com. Encontrarás más información en la POLÍTICA DE PRIVACIDAD.

Sobre j2logo

j2logo profile

Quiero ayudarte a que seas mejor programador/a, pero no uno cualquiera, sino uno de los top.

¿Quieres ser expert@ en Python? 🐍

❤️ He ayudado a miles de programadores/as como tú a ser mejores Pythonistas

📩 Recibe de vez en cuando trucos y scripts Python y las últimas novedades del blog

* Al enviar el formulario confirmas que aceptas la POLITICA DE PRIVACIDAD

¿Quieres ser expert@ en PYTHON?

j2logo-pythonistas

❤️ He ayudado a miles de programadores/as como tú

📩 Recibe trucos, scripts y las novedades del blog

¿Quieres dominar Python?

Python, Guía para ser un Pythonista

El curso con el que aprender el lenguaje desde cero. Con mi soporte y ayuda.

OFERTA BLACK FRIDAY

35% de descuento