Cómo copiar archivos y directorios en Python con el módulo shutil: Guía completa

1. Introducción

Python ofrece potentes herramientas para realizar operaciones con archivos de manera sencilla. Entre ellas, la copia de archivos es una de las tareas más comunes. En este artículo, explicaremos cómo usar el módulo estándar de Python shutil para copiar archivos y directorios de forma eficiente. Veremos ejemplos prácticos de código, técnicas para evitar sobrescrituras, manejo de errores y métodos avanzados de copia.

2. Preparación para copiar archivos en Python

Importar el módulo shutil

El módulo shutil forma parte de la biblioteca estándar de Python, por lo que no requiere instalación adicional. Se importa con el siguiente código:

import shutil

Con esto podrás copiar, mover o eliminar archivos. Además, si lo combinas con el módulo os, podrás verificar la existencia de archivos y directorios para fortalecer el manejo de errores.

Ventajas del módulo shutil

El módulo shutil se caracteriza por su simplicidad y operaciones intuitivas. Es especialmente útil cuando necesitas trabajar con archivos o directorios completos de manera masiva.

侍エンジニア塾

3. Uso básico del módulo shutil

Cómo usar shutil.copy()

shutil.copy() es la función más básica para copiar archivos. Copia un archivo desde su ubicación original hacia un nuevo destino.

import shutil

# Copiar archivo
shutil.copy('original.txt', 'copy.txt')

Si en el destino ya existe un archivo con el mismo nombre, será sobrescrito.

Cómo usar shutil.copy2()

shutil.copy2() copia no solo el contenido del archivo, sino también sus metadatos (fecha de creación, permisos, etc.).

import shutil

# Copiar contenido y metadatos
shutil.copy2('original.txt', 'copy_with_metadata.txt')

Es muy útil cuando deseas una copia exacta y completa del archivo.

4. Cómo copiar un directorio completo

Uso de shutil.copytree()

shutil.copytree() permite copiar un directorio completo de forma recursiva, incluyendo todos los archivos y subdirectorios.

import shutil

# Copiar un directorio completo
shutil.copytree('source_directory', 'destination_directory')

Si ya existe un directorio con el mismo nombre en el destino, se producirá un error, por lo que conviene verificar antes.

Excluir archivos o carpetas al copiar

Para excluir ciertos archivos o carpetas, puedes usar el argumento ignore junto con shutil.ignore_patterns().

import shutil

# Ignorar archivos .log al copiar
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))

Este ejemplo copia todo el directorio excepto los archivos con extensión .log.

年収訴求

5. Técnicas para evitar sobrescrituras

Usar os.path.exists()

Las funciones shutil.copy() y shutil.copy2() sobrescriben archivos por defecto. Para evitarlo, debes verificar antes si el archivo ya existe.

import shutil
import os

# Verificar existencia antes de copiar
if not os.path.exists('copy.txt'):
    shutil.copy('original.txt', 'copy.txt')
else:
    print('El archivo ya existe. Se omite la copia.')

Usar pathlib.Path.exists()

Con pathlib puedes verificar la existencia de archivos de forma más intuitiva.

from pathlib import Path

# Verificación con Path
dst = Path('copy.txt')

if not dst.exists():
    shutil.copy('original.txt', dst)
else:
    print('El archivo ya existe. Se omite la copia.')

6. Cómo mover archivos en Python

Uso de shutil.move()

shutil.move() sirve para mover archivos o directorios a otra ubicación.

import shutil

# Mover archivo
shutil.move('original.txt', 'new_folder/original.txt')

Si el directorio de destino no existe, se generará un FileNotFoundError. Por ello, se recomienda verificar y crear la carpeta si es necesario.

import shutil
import os

# Verificar y crear carpeta
if not os.path.exists('new_folder'):
    os.makedirs('new_folder')

# Mover archivo
shutil.move('original.txt', 'new_folder/original.txt')

7. Ejemplos prácticos de copia de archivos en Python

Ejemplo: Copiar un archivo

import shutil

# Copiar archivo
shutil.copy('data.txt', 'backup/data_backup.txt')

Ejemplo: Copiar un directorio completo

import shutil

# Copiar directorio
shutil.copytree('project_files', 'project_backup')

Ejemplo: Evitar sobrescritura

import shutil
import os

# Copiar sin sobrescribir
if not os.path.exists('backup/report.txt'):
    shutil.copy('report.txt', 'backup/report.txt')
else:
    print('El archivo ya existe. Se cancela la copia.')

8. Avanzado: Copiar solo archivos de un tipo específico

Con el módulo glob puedes copiar únicamente ciertos formatos de archivo (como .txt o .csv).

import shutil
import glob

# Copiar todos los archivos .txt
for file in glob.glob('data/*.txt'):
    shutil.copy(file, 'backup/')

Esto copiará todos los archivos .txt de la carpeta data hacia backup.

9. Manejo de errores y excepciones

Es importante manejar los posibles errores que pueden ocurrir al trabajar con archivos, como que no se encuentre el archivo o que haya problemas de permisos.

Añadir manejo básico de excepciones

import shutil

try:
    shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
    print(f'Archivo no encontrado: {e}')
except PermissionError as e:
    print(f'Error de permisos: {e}')
except Exception as e:
    print(f'Ocurrió un error inesperado: {e}')

Este código captura errores específicos y responde de forma adecuada a cada uno.

10. Conclusión

Con el módulo shutil de Python puedes copiar archivos y directorios de manera sencilla. Al añadir técnicas para evitar sobrescrituras, seleccionar archivos específicos y manejar errores, puedes hacer que tus operaciones con archivos sean más seguras y eficientes. Usa estas técnicas para mejorar tu flujo de trabajo diario con Python.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール