Fases del análisis de datos
Acceso a datos (III)
Seguimos planteando en esta entrada cómo desarrollar procedimientos de acceso a datos cuando éstos están y son componentes de un directorio. Las formas más simples de trabajo las vimos en [entrada anterior], aunque seguiré recurriendo a su contenido para abordar la solución a los problemas que nos planeamos ahora, ya que es necesario.
Cuando recopilamos datos de nuestros directorios de trabajo para elaborar la memoria de trabajo estamos empleando "manualmente" similares procedimientos de trabajo que ahora pretendo automatizar.
Ese trabajo "manual" mediante el recuento de documentos se produce a veces por falta de previsión, instrumentos y/o de sistematicidad en el uso de sistemas de recogida de datos (posiblemente este es el caso de la memoria), pero otras veces se debe a la propia naturaleza de determinado planteamiento de trabajo, [como es el caso] que nos ha traído hasta aquí.
Dándole la vuelta al argumento anterior, es posible que la responsable de que el tipo de análisis referenciado en el enlace anterior no se realicen como más frecuencia, a pesar de su interés para la evaluación de las actuaciones de los SEO, es la carencia de instrumentos que incorpores procedimientos como los que se explican en esta entrada.
Para proceder con esta explicación necesito que nos situemos en un supuesto concreto. Ahora sólo supuesto, pero muy próximo a una necesidad concreta, hasta tal punto que esta entrada sirve como lectura previa, necesaria para dar continuidad a un [proceso de análisis de datos] que se está desarrollando simultáneamente. En realidad, lo que expongo en esta entrada es la solución parcial a un problema que se plantea em él.
El objetivo (repito, parcial allí, nuclear aquí) es facilitar y automatizar hasta donde nos sea posible la cuantificación del tipo de archivos que contienen determinados directorios en función de determinadas condiciones:
- Que el directorio sólo contenga un elemento.
- Y que este elemento sea un documento (no un subdirectorio).
A partir de aquí se trata de conocer cuantos directorios cumplen esos criterios y cuantos documentos pertenecen a determinadas categorías, las cuales se definen por la tipología de los documentos.
Para más detalle sobre estas cuestiones ver la [documentación] (pendiente) sobre el análisis de datos. Aquí lo que nos interesa es plantear los problemas a los que debemos dar solución y cómo se concreta esta.
Veamos cuáles son los problemas a resolver...
- Primero: acceder al directorio raíz que contiene los directorios a estudiar
- Segundo: acceder sucesivamente a cada uno de esos directorios
- Tercero: contar el número de elementos (subdirectorios y documentos) que contiene cada directorio
- Cuarto: de entre todos, seleccionar los directorios que contengan sólo un número determinados de elementos, concretamente sólo uno.
- Quinto: diferenciar entre documentos y subdirectorios y trabajar sólo con los directorios que contengan un documento (no un subdirectorio)
- Sexto: identificar el tipo de documento de que se trata en función de su extensión.
- Séptimo: contabilizar cada tipo de documento y realizar cálculos con los datos resultantes.
... y cual la solución encontrada:
import osdirectorio = "D:/EXPEDIENTES_SEO"contenido = os.listdir(directorio)n_doc = 0n_conten = 0n_dir = 0#Extensiones a identificar
exten_doc = 0exten_pdf = 0doc_texto = 0exten_xls = 0#Recorrido del listado de archivosfor exped in contenido:dir_exped = directorio + "/" + exped#Seleccionar directorios de un único elementon_conten = len(os.listdir(dir_exped))if n_conten == 1:with os.scandir(dir_exped) as entradas:for entrada in entradas:if entrada.is_file():nombre_sin_extension, extension = os.path.splitext(entrada)if extension == '.doc' or extension == '.docx' or extension == '.odt':exten_doc = exten_doc + 1elif extension == '.pdf':exten_pdf = exten_pdf + 1elif extension == '.xls' or extension == '.xlsx' or extension == '.ods':exten_xls = exten_xls + 1#Resultados cuantitativosdoc_texto = exten_doc + exten_pdfprint("Número de documentos Procesador de texto " ,str(exten_doc))print("Número de documentos de tipo PDF " ,str(exten_pdf))print("Total documentos de texto: " , str(doc_texto))print("Número de documentos Hoja de cálculo " ,str(exten_xls))
La solución a la primera cuestión es bien simple (directorio = "D:/EXPEDIENTES_SEO"), ya que se basa en expresarla como cadena de texto y asignarla a una variable que usaremos posteriormente para construir la ruta en la que debe buscar el script.
A partir de aquí necesitamos trabajar con el módulo os de Python (import os), ya que es la base de este script.
Sin ir mas lejos, de la solución a la segunda cuestión: la creación de un listado de los directorios (contenido = os.listdir(directorio)) a los que deberemos acceder (dir_exped = directorio + "/" + exped) de forma sucesiva mediante un ciclo for (for exped in contenido:)
La tercera (contar los elementos del directorio) se resuelve aplicando la función len() sobre la función os.listdir() (n_conten = len(os.listdir(dir_exped))) y la cuarta (selección de los directorios que cumplen la condición) mediante un condicional (if n_conten == 1:) que encuadra la mayor parte de los procesos que restan y que son posibles gracias a la estructura with y a la función os.scandir() (with os.scandir(dir_exped) as entradas:) a partir de las cuales se desarrollan un nuevo bucle (for entrada in entradas:) y un nuevo condicional (if entrada.is_file():) que hacen posible dar respuesta al quinto problema (nombre_sin_extension, extension = os.path.splitext(entrada)) gracias a la función os.path.splitext() y finalmente también al sexto, en este caso mediante sucesivas estructuras condicionales (vg. if extension == '.doc' or extension == '.docx' or extension == '.odt':) que actúan sobre contadores (vg. exten_doc = exten_doc + 1).
En realidad, lo que resta (séptima cuestión problemática) podría considerarse hasta irrelevante en la definición del problema general, ya que se trata de un desarrollo dentro de un amplio abanico de posibles desarrollos. Aquí queda resuelta a modo de informe simple (vg. print("Número de documentos Procesador de texto " ,str(exten_doc))).

