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:
Pida al usuario una carpeta base.
Cree dentro de ella esta estructura:
/proyecto
/imagenes
/documentos
/codigo
/datos
/otros
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
Renombre los archivos movidos con un prefijo según su categoría:
img_001.jpg
doc_001.pdf
cod_001.py
dat_001.csv
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