Escribiendo ficheros docx de Word con Python. Capítulo VIII – Ejemplo práctico

Para terminar el tutorial de creación de ficheros docx con Python vamos a ver un caso práctico de creación de un informe a partir de información de internet.

Lo que vamos a hacer es crear un informe de la predicción generada por la AEMet (Agencia Estatal de Meteorología de España) para una localidad en concreto, digamos Palma de Mallorca, que es un lugar ideal para vivir y para crear franquicias de empresas guays.

La información la podéis encontrar en este enlace. Lo que haremos será descargar el fichero XML que hay en al anterior enlace y, a partir del mismo, crear el fichero docx.

Empezamos importando unas pocas cosas que necesitaremos:

Obtención de la información

La información que vamos a descargar está en formato XML y es información, como he comentado antes, de predicción meteorológica proporcionada por la AEMet (Agencia Estatal de Meteorología de España).

La que voy a descargar corresponde a la ciudad de Palma pero puedes elegir otras localidades (cambiando la url a usar).

De la información que acabamos de descargar podemos extraer algunos metadatos que luego usaremos en nuestro informe automatizado:

El resultado de lo anterior debería mostrar algo parecido a:

Los datos de predicción los podemos extraer de cada día para el que hay predicción disponible:

Para ello nos ayudaremos de la siguiente función adaptada de una respuesta en SO para convertir el parte de predicción de cada día del formato original en XML a un diccionario que sea más digerible.

Meto la información en un diccionario junto con algunos metadatos.

Empiezo por los metadatos:

Y ahora extraigo los datos para cada hora (viento, temperatura,…), periodo (probabilidad de tormenta, probabilidad de lluvia,…) y día (orto y ocaso).

Muestro el resultado de mi diccionario:

La salida será:

Además de los datos de la predicción vamos a descargar también datos climáticos para poder comparar si lo que se nos viene encima es normal para estas fechas, si está por encima o por debajo de lo que podríamos esperar,… Para hacer esto voy a descargar los datos climatológicos de la estación del puerto de Palma para el periodo 1980-2010. La información la podéis encontrar aquí donde veréis un botón que pone csv. Esa es la información que vamos a descargar:

Creo una función para convertir lo que descargamos en algo útil para procesar. En este punto, lo sencillo sería usar pandas pero como lo quiero mantener simple (de dependencias) voy a usar estructuras de datos básicas.

En la función anterior he dejado un (*) para indicar que eso funcionaría a partir de CPython 3.6. A partir de esa versión de CPython se preserva el orden de inserción en un diccionario. Si usas una versión más antigua de CPython podrías usar un OrderedDict. Si usas PyPy no deberías tener problema puesto que este detalle de implementación en CPython proviene de cómo funcionan los diccionarios en PyPy.

Descargamos y formateamos los datos climatológicos:

Si muestro el resultado en pantalla:

Mostrará algo como:

Más o menos, tenemos todo lo que necesitamos. ¿Pasamos ya a la parte de Docx?

Formateado del documento

Voy a crear una clase con cierta funcionalidad que me ayudará a formatear el texto y a crear el informe final en formato docx:

La clase anterior solo tiene un método útil, que es save, el resto son métodos que se usan internamente para crear la portada del documento, _title_page, una página con una nota legal informando sobre el origen de los datos y sobre la responsabilidad de los usos de los mismos, _nota_legal, un método _footer que añade algo de información en los pies de página, y el método _fcst_page que en realidad añade varias páginas con la información meteorológica y climatológica que hemos procesado. Todos estos métodos internos se invocan al instanciar la clase. Lo podemos hacer de la siguiente forma:

Ese objeto ya tendrá la información procesada y lo único que nos quedaría es guardarlo en disco con el formato docx con el nombre que le indiquemos:

El resultado final lo podéis ver en este enlace.

Espero que os hayan gustado los distintos capítulos del tutorial. Si tenéis dudas en alguno de los capítulos podéis preguntar en los comentarios del capítulo que corresponda.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

forty four − thirty nine =