miércoles, 5 de noviembre de 2025

Datos. Directorios y archivos

Archivos según extensión

Seguimos trabajando en cómo acceder a datos cuando éstos son los componentes de un directorio, esto es: cómo acceder a archivos. Las formas más sencillas las vimos en entrada anterior, y seguiré recurriendo a su contenido para la solución a los problemas que nos planeamos ahora.

Para que nos hagamos una idea de qué estoy tratando de decir, cuando recopilamos los archivos de nuestros directorios para elaborar la memoria de trabajo (por ejemplo) estamos empleando "manualmente" procedimientos similares, aunque manualmente; ahora el objetivo es automatizarlos. Si al final de curso has tenido que contar los archivos de una serie de directorios como medio para el recuento de actuaciones, seguro que comprenderás perfectamente que esta automatización merece la pena.

Ese trabajo "manual" de 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 del trabajo a desarrollar en el caso de la Memoria), pero otras veces se debe a la propia naturaleza de determinado planteamiento de trabajo. Y dándole una vuelta a estas cuestiones, también es posible que la carencia de recursos para automatizar estas tareas sea, en parte, responsable de que no se realicen más análisis de las actuciones de lso SEO como medio de investigación en la acción, a pesar del gran interés que para la mejora de dicha actuación tienen estos estudios.

Favorece el planeamiento de esta entrada que nos situemos en un supuesto práctico como puede ser el análisis del contenido de los archivos de un conjunto de expedientes SEO con determinado objetivo como razón de ser de ese recuento, pero que requiere cuantificar los archivos por directorio y de ese total cuantos en función de su extensión (o tipo).

Veamos cuáles son los problemas a resolver...

  • Primero: acceder al directorio raíz que contiene los (sub)directorios a estudiar
  • Segundo: acceder sucesivamente a cada uno de esos (sub)directorios
  • Tercero: contar el número de elementos (subdirectorios y documentos) que contiene cada directorio
  • Cuarto: de entre ellos, seleccionar los directorios que contengan un número determinados de elementos (vg. 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: contar cada tipo de documento y realizar cálculos con los datos resultantes.

... y cual es el script que los soluciona:



import os

directorio = "D:/EXPEDIENTES_SEO"
contenido = os.listdir(directorio)

n_doc = 0
n_conten = 0
n_dir = 0

#Extensiones a identificar
exten_doc = 0
exten_pdf = 0
doc_texto = 0
exten_xls = 0

#Recorrido del listado de archivos
for exped in contenido:
	dir_exped = directorio + "/" + exped
    
#Seleccionar directorios de un único elemento    
	n_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 + 1
					elif extension == '.pdf':
						exten_pdf = exten_pdf + 1                    
					elif extension == '.xls' or extension == '.xlsx' or extension == '.ods':                        
						exten_xls = exten_xls + 1

#Resultados cuantitativos
doc_texto = exten_doc + exten_pdf

print("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 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 accedemos dir_exped = directorio + "/" + exped mediante for exped in contenido:.

La tercera (contar los elementos del directorio) se resuelve aplicando n_conten = len(os.listdir(dir_exped)) y la cuarta (selección de los directorios que cumplen la condición) mediante if n_conten == 1: que encuadra la mayor parte de los procesos que restan y que son posibles gracias a la estructura with os.scandir(dir_exped) as entradas: a partir de laque se desarrolla 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 zcode>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) podría considerarse hasta irrelevante en la definición del problema general, ya que son posibles múltiples soluciones. Aquí queda resuelta a modo de informe simple (vg. print("Número de documentos Procesador de texto " ,str(exten_doc))).

No hay comentarios:

Publicar un comentario

Comenta esta entrada