Nombre y extensión
Después de haber aprendido en la entrada anterior a buscar archivos dentro de directorios complejos en lo que llamamos modo-en-profundidad, vamos a aprender en ésta a trabajar con los dos componentes del identificador del archivo: su nombre y su extensión. Ambas forman parte de la información relevante sobre un archivo previa a acceder a su contenido.
Nos interesa saber cómo identificar y seleccionar archivos en función de su extensión para múltiples cuestiones; por ejemplo, para seleccionar dentro de un amplio conjunto de archivos aquellos que pertenecen a una categoría determinada, por ejemplo, archivos .pdf
# Biblioteca --------------------------------------------------------------
from pathlib import Path
# ---- Función -------------------------------------------------------------
def buscar_pdf(carpeta_inicial):
# Convertimos el string en un objeto Path para usar sus métodos
directorio = Path(carpeta_inicial)
# Verificamos que la ruta proporcionada sea un directorio real
if not directorio.is_dir():
print(f"La ruta '{carpeta_inicial}' no es un directorio válido.")
return
print(f"Buscando archivos PDF en: {directorio.absolute()}\n")
print("-" * 50)
# .rglob('*.pdf') busca de forma recursiva archivos que terminen en .pdf
# El asterisco '*' es un comodín que representa cualquier nombre de archivo
conteo = 0
for archivo in directorio.rglob('*.pdf'):
# Verificamos que sea un archivo (por si existe una carpeta llamada algo.pdf)
if archivo.is_file():
# Imprimimos solo el nombre y la extensión, sin la ruta
print(archivo.name)
conteo += 1
# Resumen final para el usuario
print("-" * 50)
if conteo > 0:
print(f"Busqueda finalizada. Se encontraron {conteo} archivos PDF.")
else:
print("No se encontraron archivos PDF en esta ubicación.")
# --- Ejecutar la función ------------------------------------------------------------
ruta_objetivo = "Mi_Ruta" # Cambia ".Mi_Ruta" por la ruta que desees de tu sistema
# Llamada a la función
buscar_pdf(ruta_objetivo)
Este script Python busca de forma recursiva for archivo in directorio.rglob('*.pdf'): (en profundidad) todos los archivos pdf en una determinada ruta (la que le proporciones) ruta_objetivo = "Mi_Ruta"; te muestra el listado por pantalla print(archivo.name) y te informe del número de archivos encontrados print(f"Busqueda finalizada. Se encontraron {conteo} archivos PDF.")
Este procedimiento es muy eficiente, ya que te permite buscar cualquier tipo de archivo (en función de su extensión), siendo sugiciente con sustituir ('*.pdf') por ('*.doc') en for archivo in directorio.rglob('*.pdf'): (por ejemplo) si ahora el objetivo es listar sólo los archivos tipo .doc o cualquier otra extensión.
Pasemos ahora a trabajar con la información que aporta el nombre del archivo, que normalmente revela de qué trata o sobre qué referente. Por ejemplo, en los expedientes de alumnos, es común que los nombres de los archivos tengan algo que ver con el nombre y/o los apellidos del niño; también que hagan referencia al contenido del archivo, como por ejemplo, si se trata de un informe o de una actuación con la familia.
Gracias a esto podemos obtener referencias para la búsqueda de determinados archivos en función de objetivos como, por ejemplo, la selección de todos los archivos relativos a determinado alumno o a determinado tipo de actuación. Para ello empleamos las siguientes estrategias de automatización.
#Bibliotecas necesarias---------------------------------------------------------------
from pathlib import Path
# Función ------------------------------------------------------------------------------
def buscar_nombre(ruta_raiz,IDENTIFICADOR):
directorio = Path(ruta_raiz)
if not directorio.is_dir():
print(f"Error: La ruta '{ruta_raiz}' no existe o no es un directorio.")
return
print(f"Iniciando búsqueda profunda de informes '{IDENTIFICADOR}'...")
print("-" * 50)
conteo = 0
# rglob('*SISE*') busca en profundidad archivos que contienen SISE en su nombre (el asterisco antes y después permite buscar SISE en cualquier posición del nombre).
for archivo in directorio.rglob(f"*{IDENTIFICADOR}*"):
if archivo.is_file(): # Verificamos que sea un archivo y no una carpeta que se llame igual
print(archivo.name) # Imprimimos solo el nombre + extensión (sin la ruta)
conteo += 1
print("-" * 50) #Para visualizar en consola
print(f"Búsqueda finalizada. Se han listado {conteo} archivos.")
# Ejecución de función --------------------------------------------------------------------------
ruta_de_busqueda = r"Mi_Ruta" #Indica aquí ("Mi_Ruta") tu ruta absoluta
IDENTIFICADOR = "Mi_Termino" # Indica aquí ("Mi_Termino") la secuencia de letras que quieres buscar en el nombre del archivo
buscar_nombre(ruta_de_busqueda, IDENTIFICADOR) #Llamada a la función
Una vez que establecemos la ruta absoluta ruta_de_busqueda = r"Mi_Ruta" y la palabra o secuencia de letras a buscar
IDENTIFICADOR = "Mi_Termino" en el nombre del archivo, datos que pasamos como parámetros a la función buscar_nombre(ruta_de_busqueda, IDENTIFICADOR), ésta (la función def buscar_nombre(ruta_raiz,IDENTIFICADOR):) asume la ruta como directorio parala búsqueda directorio = Path(ruta_raiz) e inicia la búsqueda recorriendo en profundidad .rglob() todos los directorios presenten en esa ruta for archivo in directorio.rglob(f"*{IDENTIFICADOR}*"): usando el término IDENTIFICADOR como criterio de selección.
Podemos hacer la búsqueda más compleja (modificando el identificador), y también combinar en ella procedimientos basados en la extensión y el nombre del archivo (por ejemplo, buscar en una ruta todos los archivos que sean PDF y que hagan referencia a la familia, identificado ésta referencia por la secuencia "fam"), pero la esencia del procedimiento resultará de una formulación combinada de ambos script que, cierto es, se pueden complicar mucho más de lo visto hasta aquí. Pero con ello es suficiente para nuestros fines actuales.
También podemos cambiar las tecnología a implementar para aplicar otros procedimientos más próximos a la lógica difusa y a la IA, pero eso lo veremos en una nueva entrada.
No hay comentarios:
Publicar un comentario
Comenta esta entrada