martes, 31 de marzo de 2026

Datos. Directorios y archivos

Seleccionar archivos

Criterio: extensiones de archivos categorizadas

El objetivo de esta función es la selección de archivos en función de su extensión; más concretamente realizar el recuento de archivos atendiendo a las categorías establecidas a partir de la tipología documental.

Lo específico del contexto es la diferenciación entre archivos derivados del uso de procesadores de texto y de otras fuentes, como los resultantes de la conversión a .pdf o los creados como hojas de cálculo. Este contexto se ajusta a procesos de análisis documental como los que tienen lugar cuando se estudia la composición de los expedientes de alumnos.

Al igual que en otras ocasiones, pasamos a continuación a realizar el análisis del script, diferenciando sus tres partes y empezando por las bibliotecas necesarias.



#--- Bibilotecas ----------------------------------------------------

import os
import csv
import pandas as pd
import matplotlib.pyplot as plt


Podemos apreciar la presencia de cuatro bibliotecas cuya función indica la funcionalidad esperada para la función: el uso de directorios y archivos mediante os, la creación de una base de datos simple mediante csv, el análisis de datos mediante pandas y la creación de un gráfico estadístico mediante matplotlib.

Pasamos a mostrar la función la cual iniciamos con los datos necesarios para la categorización mediante categorias_ext y la declaración de la lista datos_archivos, necesaria para el recuento que resulte.



#--- Función ----------------------------------------------------------

def analizar_directorio(ruta_objetivo):

    categorias_ext = {
        'archivo-procesador': ['.doc', '.docx', '.odt'],
        'archivo-pdf': ['.pdf'],
        'archivo-HCalc': ['.xls', '.xlsx', '.ods']
    }
    
    datos_archivos = []
    conteo_categorias = {cat: 0 for cat in categorias_ext}
    conteo_categorias['otros'] = 0

# 1. Búsqueda en profundidad (os.walk)
    for raiz, directorios, archivos in os.walk(ruta_objetivo):
        for nombre_archivo in archivos:
            nombre, ext = os.path.splitext(nombre_archivo)
            ext = ext.lower()
            
            categoria = 'otros'
            for cat, extensiones in categorias_ext.items():
                if ext in extensiones:
                    categoria = cat
                    break
            
            if categoria != 'otros':
                datos_archivos.append({
                    'Nombre': nombre_archivo,
                    'Extensión': ext,
                    'Categoría': categoria
                })
                conteo_categorias[categoria] += 1
            else:
                conteo_categorias['otros'] += 1

# 2. Guardar en CSV
    ruta_csv = os.path.join(os.path.dirname(__file__), 'analisis_archivos.csv')
    with open(ruta_csv, 'w', newline='', encoding='utf-8') as f:
        escritor = csv.DictWriter(f, fieldnames=['Nombre', 'Extensión', 'Categoría'])
        escritor.writeheader()
        escritor.writerows(datos_archivos)

# 3. Mostrar listado por consola
    print(f"{'NOMBRE':<50} | {'CATEGORÍA'}")
    print("-" * 70)
    for fila in datos_archivos:
        print(f"{fila['Nombre'][:48]:<50} | {fila['Categoría']}")

# 4. Tabla resumen con Pandas
    df_resumen = pd.DataFrame(list(conteo_categorias.items()), columns=['Tipo', 'Cantidad'])
    # Solo mostramos las categorías que nos interesan (excluyendo 'otros' si prefieres)
    df_resumen = df_resumen[df_resumen['Tipo'] != 'otros']
    
    print("\n--- RESUMEN DE DATOS ---")
    print(df_resumen.to_string(index=False))

# 5. Gráfico Sectorial
    if df_resumen['Cantidad'].sum() > 0:
        plt.figure(figsize=(8, 6))
        plt.pie(df_resumen['Cantidad'], labels=df_resumen['Tipo'], autopct='%1.1f%%', startangle=140)
        plt.title('Distribución de Archivos por Categoría')
        plt.show()
    else:
        print("\nNo se encontraron archivos de las categorías especificadas para generar el gráfico.")


Lo que sigue en la función son las diferentes partes o fases de su desarrollo, que se relacionan, cada una de ellas, con las bibliotecas vistas en la primera parte del análisis, incluyendo al archivo del documento csv y la visualización por consola de la tabla de datos y del gráfico resultante del uso de matplotlib.

Aunque el almacenamoento y la visualización son interesantes, la razón de ser de la función se desarrolla en la identificada como # 1. Búsqueda en profundidad (os.walk), ya que es en ella donde tiene lugar la búsqueda de los archivos, la identificación diferenciada del nombre y de la extensión y su almacenamiento en función de la categoría que deriva de ésta.

Finalizamos el análisis con el del script de ejecución de la función, que se simplifica al máximo al constar únicamente con el procedimiento para concretar la ruta en la que realizar el análisis ruta = r"Mi_Ruta" y la llamada a la función, incluyendo el parámetro resultante de lo anterior analizar_directorio(ruta)



# --- Script de ejecución de la función ----------------------------------------------------------------------

ruta = r"Mi_Ruta" #Indica aquí tu ruta absoluta
analizar_directorio(ruta)


Todo lo que resulta del uso del script corre a cargo de la función analizar_directorio()