Seleccionar directorios (I)
Criterio: nombre del archivo. Dato único
El objetivo de esta entrada es crear un script que permita seleccionar directorios cuyo contenido cumpla determinada característica y crear con ellos un directorio de orden superior para almacenar dichos directorios.
El contexto concreto que se plantea como referencia es la búsqueda de los directorios que contengan archivos cuyo nombre contenga la secuencia "SISE". Esto remite al procedimiento explicado en esta entrada. No obstante, el procedimiento que se explica en esta entrada tiene aplicaciones generales cuando la selección de determinado directorio (que es su objetivo principal) obedece a cualquier otro criterio: esté este definido por el tipo de archivo (extensión) o por cualquier criterio relativo al nombre del archivo. También es similar, aunque aquí las diferencias son mayores, a proyectos basados en el número de archivos por directorio.
El análisis del código permite diferenciar tres partes: las bibliotecas necesarias, la o las funciones y el script de llamada y activación de la (o las) función. Empezando por la primera...
# --- Bibliotecas necesarias ----------------------------------
import os
import shutil
Ambas bibliotecas están pensadas para el trabajo con rutas, directorios y estructuras de directorios y archivos y determinan cómo se formula la función que sigue a continuación. Sobre os puedes consultar esta entrada
# --- Función --------------------------------------------------------------------------------------------
def buscar_directorio(ruta_grupo):
# 1. Configuración
patron = "Mi_Termino" #Escribe aquí la secuencia (letras) que debe contener el nombre del archivo
nombre_destino = "Mi_Dir_Destino" #Escribe aquí el nombre del directorio de destino
ruta_destino = os.path.join(ruta_grupo, nombre_destino)
if not os.path.exists(ruta_destino): #Crea el directorio (nombre_destino -> Mi_Dir_Destino)
os.makedirs(ruta_destino)
print(f"[INFO] Creado directorio de destino: {nombre_destino}")
# 2. Identificar subdirectorios
subdirectorios = [f for f in os.listdir(ruta_grupo)
if os.path.isdir(os.path.join(ruta_grupo, f))
and f != nombre_destino]
print(f"[INICIO] Analizando {len(subdirectorios)} carpetas ...")
conteo = 0
for carpeta in subdirectorios:
ruta_completa_carpeta = os.path.join(ruta_grupo, carpeta)
hallado = False
archivo_trigger = ""
for raiz, _, archivos in os.walk(ruta_completa_carpeta): # Búsqueda en profundidad del patrón Mi_Termino
for nombre_fichero in archivos:
if patron.lower() in nombre_fichero.lower():
hallado = True
archivo_trigger = nombre_fichero
break
if hallado:
break
# 3. Traslado a nombre_destino si hay coincidencia
if hallado:
try:
shutil.move(ruta_completa_carpeta, os.path.join(ruta_destino, carpeta))
conteo += 1
print(f"[Mi_Termino] Carpeta: '{carpeta}' -> Movida (Archivo: {archivo_trigger})")
except Exception as e:
print(f"[ERROR] No se pudo mover {carpeta}: {e}")
# 4. Resumen final (por consola)
print("\n" + "="*50)
print("RESUMEN FINAL FASE 3")
print("-" * 50)
print(f"Total carpetas analizadas: {len(subdirectorios)}")
print(f"Total carpetas con 'Mi_Termino': {conteo}")
print(f"Ubicación: {ruta_destino}")
print("="*50)
En el código de la función incluyo los comentarios necesarios para comprender su lógica, que resumo ahora: Establecemos primero las condiciones de búsqueda y el identificador del directorio de destino del resultado de la búsqueda. Ejecutamos después (segundo) la búsqueda de los archivos en profundidad en los directorios de la ruta establecida como objetivo y seleccionamos dichos directorios. Trasladamos (tercero) esos directorios a su carpeta-directorio de destino y, finalmente (cuarto) informamos del proceso y de los resultados mediante la consola.
Para finalizar esta exposición, planteo ahora el script que activa la función, pasándola el parámetro que esta necesita para ejecutarse.
#--- Llamada a función -------------------------------------------------------------------------------
if __name__ == "__main__":
ruta_proc = r"Mi_Ruta" # Introduce aquí tu ruta absoluta
buscar_directorio(ruta_proc)
NOTA
Recuerda que para que todo funciones correctamente, debes reconstruir estos tres componentes como un script único.
No hay comentarios:
Publicar un comentario
Comenta esta entrada