Organización de Archivos

 Organizar archivos implica:

  • Clasificar por tipo

  • Renombrar según reglas

  • Mover a carpetas específicas

  • Eliminar duplicados

  • Crear estructuras de carpetas automáticas

Vamos a ver técnicas y ejemplos prácticos.

1. Clasificar archivos por extensión

Este es el caso más común: ordenar una carpeta de descargas.

import os
import shutil

def clasificar_por_extension(ruta):
    for archivo in os.listdir(ruta):
        origen = os.path.join(ruta, archivo)

        if os.path.isdir(origen):
            continue

        _, extension = os.path.splitext(archivo)
        extension = extension[1:].lower()  # quitar el punto

        destino = os.path.join(ruta, extension)

        os.makedirs(destino, exist_ok=True)
        shutil.move(origen, os.path.join(destino, archivo))

2. Renombrado masivo de archivos

Ideal para fotos, documentos escaneados, etc.

import os

def renombrar_masivo(ruta, prefijo):
    contador = 1
    for archivo in os.listdir(ruta):
        _, ext = os.path.splitext(archivo)
        nuevo_nombre = f"{prefijo}_{contador}{ext}"
        os.rename(os.path.join(ruta, archivo),
                  os.path.join(ruta, nuevo_nombre))
        contador += 1

3. Eliminar archivos duplicados (por tamaño y contenido)

import os
import hashlib

def hash_archivo(ruta):
    h = hashlib.md5()
    with open(ruta, "rb") as f:
        h.update(f.read())
    return h.hexdigest()

def eliminar_duplicados(ruta):
    vistos = {}
    for archivo in os.listdir(ruta):
        ruta_archivo = os.path.join(ruta, archivo)

        if os.path.isdir(ruta_archivo):
            continue

        h = hash_archivo(ruta_archivo)

        if h in vistos:
            os.remove(ruta_archivo)
        else:
            vistos[h] = archivo

4. Crear estructuras de carpetas automáticamente

Muy útil para proyectos, cursos, informes, etc.

import os

def crear_estructura(base):
    carpetas = [
        "imagenes",
        "documentos",
        "videos",
        "audios",
        "otros"
    ]
    for c in carpetas:
        os.makedirs(os.path.join(base, c), exist_ok=True)

ACTIVIDAD PRÁCTICA: “Organizador profesional de proyectos”

Objetivo: que tus alumnos creen un sistema completo de organización de archivos para un proyecto real.

Enunciado

Crea un programa que:

  1. Pida al usuario una carpeta base.

  2. Cree dentro de ella esta estructura:

/proyecto
    /imagenes
    /documentos
    /codigo
    /datos
    /otros
  1. Clasifique los archivos según su tipo:

    • imágenes → .jpg, .png, .gif

    • documentos → .pdf, .docx, .txt

    • código → .py, .js, .html, .css

    • datos → .csv, .json

    • otros → resto

  2. Renombre los archivos movidos con un prefijo según su categoría:

    • img_001.jpg

    • doc_001.pdf

    • cod_001.py

    • dat_001.csv

  3. Muestre un resumen final con cuántos archivos movió por categoría.

Solución propuesta

import os
import shutil

CATEGORIAS = {
    "imagenes": [".jpg", ".jpeg", ".png", ".gif"],
    "documentos": [".pdf", ".docx", ".txt"],
    "codigo": [".py", ".js", ".html", ".css"],
    "datos": [".csv", ".json"]
}

def organizar_proyecto(ruta):
    # Crear estructura
    for carpeta in CATEGORIAS.keys():
        os.makedirs(os.path.join(ruta, carpeta), exist_ok=True)
    os.makedirs(os.path.join(ruta, "otros"), exist_ok=True)

    contadores = {c: 1 for c in CATEGORIAS.keys()}
    contadores["otros"] = 1

    # Clasificar archivos
    for archivo in os.listdir(ruta):
        origen = os.path.join(ruta, archivo)

        if os.path.isdir(origen):
            continue

        _, ext = os.path.splitext(archivo)
        ext = ext.lower()

        categoria = "otros"
        for cat, extensiones in CATEGORIAS.items():
            if ext in extensiones:
                categoria = cat
                break

        # Renombrar
        nuevo_nombre = f"{categoria[:3]}_{contadores[categoria]:03d}{ext}"
        contadores[categoria] += 1

        destino = os.path.join(ruta, categoria, nuevo_nombre)
        shutil.move(origen, destino)

    # Resumen
    print("\nResumen de organización:")
    for cat, num in contadores.items():
        print(f"{cat}: {num - 1} archivos movidos")

Ejemplo de salida

Resumen de organización:
imagenes: 5 archivos movidos
documentos: 3 archivos movidos
codigo: 7 archivos movidos
datos: 2 archivos movidos
otros: 4 archivos movidos