viernes, 20 de febrero de 2026

DATOS. Acceso a datos

Recuento de directorios y archivos

Para completar el tratamiento de los directorios y de los archivos como datos, en esta entrada retomaremos su recuento pero esta vez haciendo uso de la biblioteca pathlib. De este modo dispondremos de un recurso con funcionalidad similar a la que ofrece os, pero más actualizado. Sólo nos interesa aquí como alternativa, por lo que me limitaré a unos mínimos en el tratamiento de esta cuestión.

Empezaré por presentar un script que resume los procedimientos vistos en las dos entradas anteriores de esta misma subsección: el recuento en profundidad de directorios y archivos de forma diferenciada y la cuantificación de los archivos en función de su extensión.


from pathlib import Path
from collections import Counter

#---- FUNCIÓN-------------------------------------------------------------

def analizar_directorio(ruta_entrada, archivo_salida):
    # Convertimos la cadena de texto en un objeto Path
    path_raiz = Path(ruta_entrada)

    if not path_raiz.exists() or not path_raiz.is_dir():
        print(f"Error: La ruta '{ruta_entrada}' no es un directorio válido.")
        return

    # Inicializamos contadores
    total_directorios = 0
    total_archivos = 0
    extensiones = Counter()

    # rglob('*') busca de forma recursiva en todos los niveles
    for elemento in path_raiz.rglob('*'):
        if elemento.is_dir():
            total_directorios += 1
        elif elemento.is_file():
            total_archivos += 1
            # .suffix devuelve la extensión con el punto (ej: .txt)
            ext = elemento.suffix.lower() if elemento.suffix else "Sin extensión"
            extensiones[ext] += 1

    # Construcción del informe de resultados
    informe = []
    informe.append("=" * 50)
    informe.append(f"INFORME DE ANÁLISIS RECURSIVO")
    informe.append(f"Directorio origen: {path_raiz.absolute()}")
    informe.append("=" * 50)
    informe.append(f"Total de directorios encontrados: {total_directorios}")
    informe.append(f"Total de archivos encontrados:    {total_archivos}")
    informe.append("-" * 50)
    informe.append(f"{'EXTENSIÓN':<20} | {'CANTIDAD':<10}")
    informe.append("-" * 50)

    # Ordenar extensiones por frecuencia (de mayor a menor)
    for ext, cuenta in extensiones.most_common():
        informe.append(f"{ext:<20} | {cuenta:<10}")
    
    informe.append("=" * 50)

    # Convertir la lista del informe en un solo string
    texto_final = "\n".join(informe)

    # Mostrar por pantalla
    print(texto_final)

    # Guardar en archivo TXT
    try:
        # Pathlib también permite escribir archivos directamente
        Path(archivo_salida).write_text(texto_final, encoding='utf-8')
        print(f"\n[ÉXITO] El informe se ha guardado en: {archivo_salida}")
    except Exception as e:
        print(f"\n[ERROR] No se pudo escribir el archivo: {e}")

# --- USO DE LA FUNCIÓN -------------------------------------------------------

mi_directorio = "D:/BasesDatosTest" 
nombre_txt = "analisis_pathlib.txt"

analizar_directorio(mi_directorio, nombre_txt)

Además de la diferencia esperada en cuanto importación de librerías (pathlib frente a os, y Counter de la biblioteca collections), las diferencias claves respecto a los script basados en os radica en el uso de determindas funciones específicas de pathlib:

  • la función Path.rglob('*') simplifica la búsqueda recursiva ("r" viene de "recursive"). Al usar el comodín *, pedimos que busque todo lo que hay dentro del directorio, con independencia de los niveles de anidamiento que pueda presentar su estructura.
  • Counter es un diccionario especializado que automatiza el conteo de las exteniones de los archivos (extensiones = Counter()).
  • El atributo.suffix devuelve directamente la extensión del archivo (elemento.suffix.lower()). Mediante .lower unificamos el formato de la extensión a minúsculas evitando así posibles duplicidades.

Aunque es una cuestión secundaria en este script, interesa destacar también la forma en que se genera aquí el archivo .txt, ya que supone una mejora respecto al modo básico de proceder: Path.write_text() es una forma abreviada de escribir archivos de texto sin necesidad de abrir y cerrar flujos manualmente.

Nota

El código mostrado en esta entrada ha sido desarrollado usando IA Gemini 3 y posteriormente adaptado por el autor.

No hay comentarios:

Publicar un comentario

Comenta esta entrada