Cómo copiar y mover archivos en Python con los módulos shutil y os
El desarrollo en Python a menudo requiere realizar operaciones con archivos y directorios. Crear copias de seguridad, procesar descargas de usuarios, organizar la estructura de proyectos o desplegar aplicaciones son tareas que necesitan una gestión programática del sistema de archivos. Automatizar estas operaciones simplifica enormemente la administración de datos y elimina la necesidad de realizar tareas repetitivas manualmente.
El módulo shutil de Python proporciona utilidades de alto nivel para trabajar con archivos y directorios. Combinado con el módulo os, forma un potente conjunto de herramientas multiplataforma para crear scripts flexibles de gestión del sistema de archivos. Ambos módulos forman parte de la biblioteca estándar de Python y están disponibles sin necesidad de instalación adicional.
Introducción al módulo shutil
El módulo shutil debe su nombre a "shell utility" y ofrece un conjunto de funciones para operaciones de alto nivel con archivos y directorios. Sus funciones principales incluyen:
copy()— copia un archivo sin conservar los metadatoscopy2()— copia un archivo conservando todos los metadatoscopytree()— copia directorios completos de forma recursivamove()— mueve archivos y carpetas a una nueva ubicaciónrmtree()— elimina directorios y su contenido de forma recursivacopyfileobj()— copia objetos de archivo byte a byte
El módulo shutil se integra eficazmente con el módulo os y es adecuado tanto para pequeños scripts de automatización como para grandes aplicaciones a nivel empresarial.
Métodos para copiar archivos
Copia básica con shutil.copy()
La función shutil.copy() realiza una copia simple del contenido del archivo sin transferir los metadatos:
import shutil
origen = 'carpeta_origen/ejemplo.txt'
destino = 'carpeta_destino/ejemplo.txt'
shutil.copy(origen, destino)
Esta función copia únicamente el contenido del archivo. Los metadatos del archivo, como la fecha de creación, la hora de la última modificación y los permisos de acceso, no se conservan. La función es similar al comando cp en sistemas Unix/Linux sin usar banderas de conservación de atributos.
Es importante recordar que si el directorio de destino no existe, se producirá un error. Se recomienda verificar previamente la existencia del directorio de destino o crearlo mediante programación.
Copia con conservación de metadatos: shutil.copy2()
Cuando necesites conservar toda la información del archivo, incluyendo marcas de tiempo, propietario y permisos de acceso, debes usar la función copy2():
shutil.copy2('archivo.txt', 'backup/archivo.txt')
Este método es especialmente útil al crear copias de seguridad, migrar proyectos entre diferentes sistemas o cuando es crítico conservar los atributos originales de los archivos. La función copy2() garantiza la reproducción más fiel posible del archivo original en la nueva ubicación.
Cómo copiar directorios completos
Copia recursiva con shutil.copytree()
Para copiar directorios completos con todas sus subcarpetas y archivos anidados se utiliza la función copytree():
shutil.copytree('proyecto_antiguo', 'proyecto_nuevo')
Por defecto, la función copytree() lanza un error FileExistsError si el directorio de destino ya existe. A partir de Python 3.8, puedes usar el parámetro dirs_exist_ok=True para permitir la sobrescritura o fusión del contenido:
shutil.copytree('proyecto_antiguo', 'proyecto_nuevo', dirs_exist_ok=True)
La función trabaja de forma recursiva y se aplica en los siguientes escenarios:
- Clonación de plantillas de proyectos