Carga de datos desde una hoja de cálculo
Ahora como procedimiento, pero en breve como recurso dentro de un trabajo, lo que trataré en esta entrada es algo que resulta básico en todo proceso de análisis de datos cuando usamos Python como herramienta: acceder a los datos.
Es hora de volver a tratar cuestiones de utilidad inmediata para ir sacando provecho del estudio realizado (curiosamente) sobre el trabajo con textos, concretamente sobre el [acceso al contenido de archivos pdf] (1). Sería contraproducente perder esta oportunidad que nos vuelve a abrir una dirección de trabajo y aprendizaje que dejamos en suspenso en otro momento, precisamente por falta de recursos para su continuidad. Ahora disponemos de ellos.
Me refiero en concreto a la posibilidad de acceder automáticamente a un volumen amplio de datos situados en múltiples hojas de cálculo. Hasta ahora hemos visto cómo hacer algo similar mediante OOo Basic, pero cuando los datos están disponibles en tablas de datos, pero no cuando están dispersos en múltiples archivos. Lo que con OOo Basic resulta complicado se resuelve con Python de forma sencilla (2).
Antes de iniciar la explicación debo decir que la puesta en práctica del ejemplo presenta una limitación para tí, ya que, por motivos de confidencialidad, no me es posible aportarte el conjunto de archivos (Calc) con los que podría experimentar. Además, ahora por motivos de viabilidad de contenido, tampoco me puedo detener demasiado en explicaciones sobre el origen y la naturaleza de dichos archivos. Por suerte creo que la explicación es suficientemente sencilla para que puedas replicarla con tus propios archivos (siempre que cumplan la condición que te indicaré) y, además, el uso práctico de este procedimiento en uno de los proyectos de este blog (3) que permitirá comprender (en su momento) la utilidad del propio procedimiento.
Dejando al lado otras posibles consideraciones, paso a presentarte el script. esta vez sí me parece pertinente detenerme en su explicación; es necesario compensar así lo que no me es posible aportarte como materiales.
import ezodflibro = ezodf.opendoc('doc/AaronLs.ods') #Cargar un libro ubicado en el directorio del scripthoja =libro.sheets[0] # Acceder a la hoja activa (la primera)#Acceder al contenido de una celda individual (B1)celda1 = hoja['B1'].valueprint(f'Nombre del alumno: {celda1}')
El anterior script usa la librería ezodf (import ezodf) (4) para acceder a un documento (libro = ezodf.opendoc('doc/AaronLs.ods')), posicionarse en una hoja (hoja =libro.sheets[0]) y en una celda (celda1 = hoja['B1'].value) para extraer el contenido de esa celda. Este procedimiento es muy simple y no difiere mucho del que usamos en OOo Basic (5). Es un procedimiento muy útil (y sencillo) en determinados casos, pero resulta insuficiente cuando necesitamos acceder a ese mismo dato, en múltiples archivos y no disponemos de la base de datos que nos facilite el trabajo (6).
Cuando no disponemos de una base de datos unificada necesitamos crearla a partir de las hojas de cálculo que contienen los datos individuales (7), accediendo a cada una de ellas. Este script resuelve automáticamente esta tarea.
import ezodfimport os#Variablesi=0na = 0nn = 0archivos = []nombres= []#Primera fase. Cargamos el listado de archivos en la lista archivosos.chdir('doc/')archivos=os.listdir('.')na = len(archivos)#Segunda fase. Recorremos la lista de expedientes extrayendo el nombrefor i in range(na):libro = ezodf.opendoc(archivos[i])hoja =libro.sheets[0]nombres.append(hoja['B1'].value)nn = len(nombres)#Control. Imprimimos la lista de nombres de alumnosprint ('\nNombres del alumnado recogido en los expedientes\n')print(nn)print(nombres)
Como puedes ver necesitamos dos bibliotecas: la que nos permite trabajar con el sistema operativo (import os) y la que necesitamos para acceder a las hojas Calc (import ezodf).
Mediante la primera asignamos a la lista archivos el contenido del directorio (doc/) que contiene todos los documentos Calc con los que vamos a trabajar: primero accedemos al directorio (os.chdir('doc/')) y después cargamos el listado de nombres de archivos en la lista (archivos=os.listdir('.')) (8)
Finalizada esta primera fase del procedimiento, la segunda consiste en recorrer cada uno de los documentos según el procedimiento visto en el script anterior, pero mediante un bucle for en el que el valor superior de rango es el número de elementos que contiene la lista (for i in range(na):), que a su vez hemos obtenido mediante la función len() (na = len(archivos)). Una vez que accedemos al documento (libro = ezodf.opendoc(archivos[i])) (9) y a la hoja (hoja =libro.sheets[0]) y a la celda, momento en que añadimos a la segunda lista nombres cada uno de los contenidos de la celda (en este caso la B1) mediante la función append() (nombres.append(hoja['B1'].value)).
Para finalizar este script, en este caso, a modo de comprobación de su correcto funcionamiento, además del número de elementos que contiene la lista (nn = len(nombres) -> print(nn)), también muestro el listado de nombres por pantalla (print(nombres)), aunque esto es perfectamente prescindible.
En resumen, conociendo el documento del que queremos extraer datos, y siempre que todos los documentos se ajusten al mismo patrón, mediante las escasas líneas de este script podemos acceder a todos los datos que necesitemos de una forma segura, rápida y sencilla. Una buena base para automatizar el acceso a los datos que necesitamos para nuestros análisis que, de paso, refuerza el interés por el uso de hojas de cálculo como medios para la recogida sistemática de información.
NOTAS
(1) Este estudio se inició con la entrada a la que enlazo en el cuerpo de la actual y se desarrolla durante nueve entradas. No se puede decir que esté concluida, aunque ya aviso [en la que da continuidad a este análisis] que necesitamos otros recursos y mucho más trabajo. En ello estamos y seguimos, por esa parte.
(2) Facilidad real, pero engañosa: es necesario combinar el uso de al menos dos bibliotecas para hacerlo posible, pero realmente es en procedimiento muy sencillo una vez que se conoce. Muy sencillo y muy potente.
(3) Me refiero aquí al estudio de la composición documental de los denominados [expedientes SEO], proyecto iniciado [con esta entrada] que lleva parado cierto tiempo, precisamente por haberse agotado la viabilidad de automatización del procedimiento de acceso a datos (no la disponibilidad de éstos), motivo por el que prefería suspender el proyecto hasta disponer de los recursos que ahora sí están disponibles, por lo que en breve reanudaré el trabajo sobre esta temática.
(4) Por tratarse de hojas de cálculo Calc. En caso de trabajar con hojas de cálculo Excell deberíamos usar (por ejemplo) la biblioteca OpenPyXL. En ese caso también habría que cambiar otras líneas de código [ver aquí], pero la lógica de script es la misma.
(5) [Por ejemplo] para el acceso a celdas y el recorrido previo necesario.
(6) Siempre podríamos generar una función que reciba como parámetro el nombre del archivo, pero sin lo que nos aporta Python, ese procedimiento se basaría en la aplicación "manual" y repetida de dicha función. Otra solución es crear previamente una base de datos (Calc) que contenga todos los datos y aplicar sobre ella procedimientos OOo Basic de [acceso a un rango de celdas]; pero ahora el procedimiento manual es precisamente la creación de esa base de datos.
(7) Cierto es que debemos guardar todas estas en un mismo directorio, cosa que deberemos hacer manualmente la mayoría de las veces, así que la automatización posiblemente no sea completa, pero es lo más próximo a ello.
(8) Debo explicar en este momento que estos archivos (hojas de cálculo) contienen datos sobre el tipo de documentos que contiene cada uno de los expedientes SEO de un grupo de alumnos con NEAE. Obviamente estos documentos contienen algunos datos que pueden considerarse confidenciales (en realidad sólo los apellidos y si acaso también los nombres), pero es suficiente para considerarlos información sensible, por lo que no se puede compartir. Estos archivos presentan todos la misma estructura, por lo que es sencillo automatizar la búsqueda sistemática de un dato concreto.
(9) Para acceder a cada documento, mediante el recorrido del bucle, vamos accediendo a cada uno de los componentes de la lista archivos[] que contiene su identificador. Dado que el acceso a los elementos de una lista se hace en base a su índice, el contador i sirve de índice variable (archivos[i]).

No hay comentarios:
Publicar un comentario
Comenta esta entrada