Organizar automáticamente los archivos del ordenador es uno de los proyectos más útiles para practicar Python. Un script puede observar una carpeta, clasificar documentos por extensión, crear directorios, evitar nombres duplicados y registrar cada movimiento. La meta no es mover archivos a ciegas, sino construir una automatización predecible, reversible y segura.
Para ampliar conceptos, consulta las guías sobre archivos de texto, copiar y mover con shutil, manejo de excepciones, logging y ejecutar scripts al iniciar Windows. Como referencias externas, revisa la documentación oficial de pathlib y la documentación oficial de shutil.
Definir reglas antes de mover archivos
Empieza con un mapa explícito. Las extensiones deben estar en minúsculas y cada categoría debe tener un destino claro. Los archivos desconocidos pueden permanecer donde están o ir a una carpeta separada.
CATEGORIAS = {
".pdf": "Documentos",
".docx": "Documentos",
".xlsx": "Planillas",
".jpg": "Imagenes",
".jpeg": "Imagenes",
".png": "Imagenes",
".mp4": "Videos",
".zip": "Comprimidos",
}Una regla visible es más fácil de revisar que una cadena extensa de condiciones.
Recorrer la carpeta con pathlib
from pathlib import Path
ORIGEN = Path.home() / "Downloads"
for ruta in ORIGEN.iterdir():
if ruta.is_file():
print(ruta.name, ruta.suffix.lower())iterdir() inspecciona únicamente el nivel actual. Es una buena opción para Descargas. Utiliza rglob() solo cuando realmente deseas recorrer subcarpetas.
Crear destinos automáticamente
categoria = CATEGORIAS.get(ruta.suffix.lower(), "Otros")
destino_carpeta = ORIGEN / categoria
destino_carpeta.mkdir(parents=True, exist_ok=True)exist_ok=True permite ejecutar el script varias veces. Mantén todas las carpetas dentro de un directorio autorizado para no dispersar datos accidentalmente.
Mover un archivo
from shutil import move
destino = destino_carpeta / ruta.name
move(str(ruta), str(destino))Antes de mover, confirma que el origen todavía exista. Otro programa podría estar descargando o modificando el archivo mientras el script trabaja.
Evitar sobrescrituras
Dos archivos pueden tener el mismo nombre. Nunca reemplaces silenciosamente. Genera un nombre disponible añadiendo un contador.
def destino_disponible(carpeta, nombre):
candidato = carpeta / nombre
if not candidato.exists():
return candidato
base = candidato.stem
extension = candidato.suffix
contador = 1
while True:
candidato = carpeta / f"{base}-{contador}{extension}"
if not candidato.exists():
return candidato
contador += 1Modo simulación
Todo organizador debería ofrecer un modo que muestre las acciones sin aplicarlas. Es la mejor defensa contra reglas equivocadas.
SIMULAR = True
if SIMULAR:
print(f"MOVER: {ruta} -> {destino}")
else:
move(ruta, destino)Ejecuta primero la simulación, revisa una muestra y habilita los cambios únicamente cuando el resultado sea correcto.
Ignorar archivos temporales
Los navegadores crean archivos parciales como .crdownload o .part. También puede haber documentos ocultos, bloqueados o con tamaño cero. Exclúyelos hasta que estén completos. Una estrategia adicional es ignorar archivos modificados durante los últimos minutos.
import time
edad = time.time() - ruta.stat().st_mtime
if edad < 120:
continueClasificar por fecha
Además de extensión, puedes crear carpetas por año y mes. Utiliza la fecha de modificación, entendiendo que puede cambiar al copiar.
from datetime import datetime
fecha = datetime.fromtimestamp(ruta.stat().st_mtime)
carpeta = ORIGEN / f"{fecha.year:04d}" / f"{fecha.month:02d}"No combines demasiadas reglas en la primera versión. Una estructura excesivamente profunda dificulta encontrar documentos.
Registrar cada acción
import logging
logging.basicConfig(
filename="organizador.log",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
)
logging.info("Movido %s a %s", ruta, destino)El log permite auditar y revertir acciones. No registres contenido privado; las rutas suelen ser suficientes.
Archivo de historial para deshacer
Guarda origen, destino y fecha en JSONL o CSV. Una función de reversión puede leer las entradas en orden inverso y devolver los archivos, siempre que no exista un archivo nuevo en la ubicación original. Si hay conflicto, detente y solicita intervención.
Configuración externa
Cuando las reglas crecen, colócalas en JSON. Así puedes añadir extensiones sin editar el código. Valida que los nombres de carpetas no contengan rutas absolutas ni secuencias que salgan del directorio permitido.
Manejo de excepciones
try:
move(ruta, destino)
except PermissionError:
logging.exception("Sin permiso para mover %s", ruta)
except FileNotFoundError:
logging.warning("El archivo desapareció: %s", ruta)
except OSError:
logging.exception("Error del sistema al mover %s", ruta)Captura errores por archivo para que un problema no detenga todo el lote. Al final, muestra un resumen de éxitos, omitidos y fallos.
Programar la ejecución
En Windows utiliza el Programador de tareas; en Linux y macOS puedes usar cron o un servicio del sistema. Es preferible ejecutar cada cierto tiempo a mantener un bucle infinito. Configura el directorio de trabajo y usa rutas absolutas, porque los programadores de tareas no siempre comienzan en la carpeta del script.
Seguridad
No organices automáticamente carpetas del sistema, repositorios, aplicaciones o directorios sincronizados sin pruebas. Evita seguir enlaces simbólicos hacia ubicaciones inesperadas. Mantén una lista de carpetas permitidas y rechaza cualquier destino que quede fuera de ellas.
Pruebas
Crea una carpeta temporal con archivos duplicados, nombres Unicode, extensiones en mayúsculas, archivos sin extensión, subcarpetas y elementos bloqueados. Comprueba que la segunda ejecución no cambie nada: una automatización idempotente es más fácil de confiar.
Errores frecuentes
Los errores habituales son sobrescribir archivos, mover descargas incompletas, procesar la carpeta de destino nuevamente, depender de rutas relativas y ejecutar sin simulación. También es común clasificar únicamente por extensión y olvidar que una extensión puede ser incorrecta o engañosa.
Conclusión
Un buen organizador no se limita a mover archivos. Define reglas legibles, crea destinos controlados, evita colisiones, registra acciones y ofrece simulación y reversión. Empieza con una sola carpeta y pocas extensiones. Después de probar con datos reales, programa la ejecución y amplía las reglas de manera gradual.






