Bucle Creativo

Navegando el Laberinto: Domina el Sistema de Archivos con Python

🎯 Objetivo de Aprendizaje

Dominar el manejo del sistema de archivos en Python utilizando el módulo moderno pathlib, desarrollando habilidades técnicas para organizar, mover y procesar datos de forma multiplataforma, fomentando el pensamiento lógico, la responsabilidad digital y la atención al detalle, para crear soluciones de software robustas que automaticen tareas cotidianas y resuelvan problemas reales de gestión de información en cualquier entorno operativo.

🌿 Activación: El Caos de la Amazonía

Imagina esta situación: acabas de regresar de una expedición increíble a la Amazonía ecuatoriana. Tu cámara está llena de cientos de fotos: animales, paisajes, ríos. Pero al conectar la cámara a tu computadora, te encuentras con un caos total: todos los archivos están en una sola carpeta, con nombres extraños como IMG_4829.jpg o foto_2026-01-15_001.jpg, mezclados con documentos y notas.

Moverlos uno por uno te tomaría horas. ¿Y si tuvieras que hacer esto con miles de archivos cada semana? Aquí es donde la programación deja de ser solo teoría y se convierte en tu superpoder. En este taller, no solo aprenderás a "leer" archivos; aprenderás a construir un asistente inteligente que organice, clasifique y gestione tu información automáticamente, sin importar si usas Windows, Mac o Linux. ¿Listo para tomar el control de tu sistema de archivos?

🛤️ Desarrollo: Del Caos al Orden

🏙️ La Analogía de la Ciudad

Para entender el sistema de archivos, imagina que tu computadora es una ciudad:

  • 🏙️ Tu Ciudad: El disco duro (C:\ o /).
  • 🏘️ Barrio Usuarios: C:\Users\ o /home/.
  • 🏠 Casa de Juan: /Juan/.
  • 📁 Carpeta Documentos: Donde guardas tus tareas.
  • 📄 Archivo: tarea.py.

Para encontrar tarea.py, necesitas la dirección completa: C:\Users\Juan\Documentos\tarea.py. A esto le llamamos ruta.

📍 Dos Tipos de Rutas

Tipo Descripción Ejemplo Ventaja / Desventaja
Absoluta Dirección completa desde la raíz. C:/Users/Juan/tarea.py ✅ Siempre funciona. ❌ No sirve en otra PC.
Relativa Desde donde estás parado ahora. ../fotos/viaje.jpg ✅ Funciona en cualquier PC. ❌ Depende de tu ubicación actual.
⚠️ Símbolos especiales:
. = Carpeta actual  |  .. = Carpeta padre (subir un nivel)  |  / = Separador de carpetas.

🐍 pathlib: La Forma Moderna

Olvídate del antiguo y confuso os.path. Desde Python 3.4+, pathlib es la herramienta elegante, legible y multiplataforma. Path no es un simple texto (string), es un objeto inteligente que entiende de rutas.

from pathlib import Path

# 1. Importaciones
# 2. Creación de objetos Path
ruta_absoluta = Path("C:/Users/Juan/Documentos/tarea.py")
ruta_relativa = Path("../fotos/viaje.jpg")
ruta_actual = Path("documento.txt")

# 3. Operaciones básicas (Obtener información)
archivo = Path("informe_final.pdf")
print(archivo.name)    # "informe_final.pdf" (nombre completo)
print(archivo.stem)    # "informe_final" (sin extensión)
print(archivo.suffix)  # ".pdf" (extensión)
print(archivo.parent)  # Path(".") (carpeta padre)
print(archivo.exists())# True o False

🔍 Navegación y Búsqueda

Explorar carpetas es como usar un mapa. pathlib te da herramientas poderosas:

from pathlib import Path

carpeta = Path(".") # Carpeta actual

# Listar todo el contenido
for item in carpeta.iterdir():
    if item.is_file():
        print(f"📄 {item.name}")

# Buscar con patrones (glob)
archivos_txt = carpeta.glob("*.txt")       # Solo en esta carpeta
archivos_py = carpeta.rglob("*.py")        # 🔍 Recursivo: en todas las subcarpetas
💡 Recuerda: glob() busca en el nivel actual. rglob() (recursive glob) busca en el nivel actual y en todas las carpetas hijas.

🏗️ Crear, Mover, Copiar y Eliminar

El operador / es mágico en pathlib: une rutas de forma inteligente, sin importar si estás en Windows o Linux.

from pathlib import Path
import shutil # Necesario para copiar

# 1. Crear carpetas (parents=True crea las intermedias, exist_ok=True evita errores si ya existe)
nueva_carpeta = Path("respaldos/2026/julio")
nueva_carpeta.mkdir(parents=True, exist_ok=True)

# 2. Crear archivo y escribir texto
archivo = nueva_carpeta / "nota.txt" # Operador / mágico
archivo.write_text("Contenido del reporte")

# 3. Mover o Renombrar
archivo.rename(nueva_carpeta / "nota_final.txt")

# 4. Copiar (preservando metadatos)
shutil.copy2(archivo, Path("copia_seguridad.txt"))

# 5. Eliminar (¡CUIDADO! No va a la papelera)
if archivo.exists():
    archivo.unlink() # Elimina archivo

🎯 Manos a la Obra: Organizador Automático de Fotos

Vamos a resolver el problema de la Amazonía. Este script lee el nombre de los archivos, extrae la fecha usando expresiones regulares (re) y los mueve a carpetas organizadas por año y mes.

# ==========================================
# IMPORTACIONES
# ==========================================
from pathlib import Path
import shutil
import re

# ==========================================
# VARIABLES DE CONFIGURACIÓN
# ==========================================
CARPETA_ORIGEN = Path("fotos_amazonia")
CARPETA_DESTINO = Path("fotos_organizadas")

# ==========================================
# FUNCIONES
# ==========================================
def extraer_fecha(nombre_archivo):
    """Busca patrones como: foto_2026-01-15_001.jpg"""
    patron = r'(\d{4})-(\d{2})-(\d{2})'
    coincidencia = re.search(patron, nombre_archivo)
    if coincidencia:
        return coincidencia.group(1), coincidencia.group(2) # año, mes
    return None, None

def organizar_fotos():
    if not CARPETA_ORIGEN.exists():
        print("❌ No encontré la carpeta de origen")
        return
    
    CARPETA_DESTINO.mkdir(exist_ok=True)
    nombres_meses = {'01': 'Enero', '07': 'Julio'} # (Simplificado para el ejemplo)
    
    for archivo in CARPETA_ORIGEN.glob("*.jpg"):
        año, mes = extraer_fecha(archivo.name)
        
        if año and mes:
            nombre_mes = nombres_meses.get(mes, f"Mes_{mes}")
            carpeta_destino = CARPETA_DESTINO / año / f"{mes}-{nombre_mes}"
            carpeta_destino.mkdir(parents=True, exist_ok=True)
            
            destino_final = carpeta_destino / archivo.name
            shutil.move(str(archivo), str(destino_final))
            print(f"✅ {archivo.name} → {año}/{nombre_mes}")
        else:
            print(f"⚠️ {archivo.name} → Sin_Fecha")

# ==========================================
# PROGRAMA PRINCIPAL
# ==========================================
if __name__ == "__main__":
    organizar_fotos()

🛡️ Nivel Experto: Metadatos EXIF y Manejo de Errores

Las fotos reales guardan la fecha exacta en sus metadatos EXIF. Usando la librería Pillow (pip install Pillow), podemos leer DateTimeOriginal en lugar de depender del nombre del archivo.

Además, un programador profesional anticipa fallos. Usa bloques try...except para manejar PermissionError (sin permisos) o FileNotFoundError (archivo borrado), evitando que tu programa se bloquee inesperadamente.

🔄 Operaciones en Lote: Puedes combinar enumerate() con glob() para renombrar cientos de archivos secuencialmente (ej: amazonia_001.jpg, amazonia_002.jpg) o usar .with_suffix(".md") para cambiar extensiones masivamente.

🎓 La Conexión con Bases de Datos Reales

Lo que aprendes aquí es la base de la gestión de datos. Observa el paralelismo:

Concepto en Archivos Equivalente en Base de Datos
Ruta absolutaRuta completa a un registro
CarpetasEsquemas o namespaces
ArchivosRegistros o documentos
Extensiones (.jpg, .pdf)Tipos de datos (BLOB, TEXT, JSON)
pathlib.PathObjetos de conexión y cursores
Buscar con glob()Consultas con WHERE y LIKE

Reflexión: Muchas bases de datos no guardan la imagen en sí, sino solo la ruta del archivo en el sistema. ¡Entender rutas es esencial!

🚀 Reto Integrador: "El Guardián de los Datos del Colegio"

Has sido contratado por la secretaría de tu colegio. Tienen una carpeta llamada documentos_desordenados con cientos de archivos PDF y Word de estudiantes, mezclados sin criterio.

Tu misión: Diseña un script en Python que:

  1. Recorra recursivamente (rglob) la carpeta de origen.
  2. Lea las primeras líneas de cada archivo de texto (o use el nombre) para detectar si es una "Matrícula", "Calificación" o "Comunicado".
  3. Cree una estructura de carpetas de destino: organizados/Tipo_Documento/Año/.
  4. Mueva los archivos de forma segura, manejando errores con try...except (por ejemplo, si el archivo está abierto por otro programa).
  5. Genere un archivo reporte_log.txt al final, indicando cuántos archivos se procesaron, cuántos fallaron y la ruta final de cada uno.
💡 Criterios de éxito: Tu código debe ser legible, usar pathlib para todas las rutas, incluir comentarios explicativos y no debe fallar si encuentra un archivo inesperado. ¡Demuestra tu pensamiento crítico y ética profesional protegiendo los datos!

🎮 Evaluación Lúdica: Pon a Prueba tu Conocimiento

Puntuación: 0 / 5

Cargando pregunta...