Para copiar se usa shutil, y tiene tres funciones que parecen la misma. No lo son: cambian en qué copian además del contenido.
También te puede interesar
Las tres funciones
import shutil
from pathlib import Path
base = Path("salida")
shutil.copyfile(base / "notas.txt", base / "copia1.txt")
shutil.copy(base / "notas.txt", base / "sub") # a una carpeta
shutil.copy2(base / "notas.txt", base / "copia2.txt")| Función | Contenido | Permisos | Fechas | Destino puede ser carpeta |
|---|---|---|---|---|
copyfile | sí | no | no | no |
copy | sí | sí | no | sí |
copy2 | sí | sí | sí | sí |
La diferencia se ve con un archivo privado:
os.chmod(base / "notas.txt", 0o600) # solo lo puede leer su dueño shutil.copyfile(base / "notas.txt", base / "c_file.txt") shutil.copy(base / "notas.txt", base / "c_copy.txt")
salidac_file.txt 0o644 c_copy.txt 0o600
copyfile no copia los permisos. El original era privado y la copia ha quedado legible por todo el mundo. Con una clave, un certificado o un archivo de configuración con contraseñas, eso es un problema. Si no tienes un motivo para usar otra, usa copy2.La carpeta de destino tiene que existir
salidaFileNotFoundError: [Errno 2] No such file or directory: 'salida/no_existe/x.txt'
Ninguna de las tres crea carpetas. Antes de copiar: destino.parent.mkdir(parents=True, exist_ok=True).
Una carpeta entera
shutil.copytree(base, Path("copia_entera"), dirs_exist_ok=True)salidacopytree: ['c_copy.txt', 'c_file.txt', 'copia1.txt', 'copia2.txt', 'latin1.txt', 'lista.txt', 'notas.txt', 'sub', 'sub/notas.txt', 'windows.txt']
Copia el árbol completo, subcarpetas incluidas. dirs_exist_ok=True permite copiar encima de una carpeta que ya existe; sin él, falla. Con ignore=shutil.ignore_patterns("*.tmp", "__pycache__") te saltas lo que no quieras llevarte.
Más información en inglés: Copy files in Python.
Todo el código se ejecutó con Python 3.14 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.