PostgreSQL a excel con Python

Exportar datos desde PostgreSQL a excel

Exportar datos desde PostgreSQL a excel no es sencillo… Si como base de datos nos referimos a MS Access, no es mayor problema. Pero si nos referimos a una base de datos más… de verdad, como puede ser PostgresSQL o MySQL o cualquier otro sistema gestor de bases de datos ya no es lo mismo. Nosotros nos vamos a ocupar en este artículo de esportar datos desde PostgreSQl a excel con Python. Nótese que donde digo excel digo LibreOffice/OpenOffice Calc también, por supuesto.

Exportar datos desde PostgreSQL a excel

Exportar datos desde PostgreSQL a excel puede ser muy sencillo

La manera sencilla pero poco productiva consiste en exportar los datos desde PostgreSQL a excel  creando un archivo de texto (valores separados por comas o como nos convenga) mediante el comando de psql \copy:

Luego este archivo lo importamos mediante excel y listos.

Pero aquí la cosa se trata de sacar directamente la información desde PostgreSQL a excel, es decir,  obtener un bonito archivo xls o xlsx mediante unas pocas líneas de código.

Herramientas necesarias

  • Servidor PostgreSQL funcionando (mi versión es la 9.0). La manera más sencilla de obtenerlo es mediante tu gestor de paquetes si utilizas Linux.
  • Python 2.7 instalado en tu computadora. Viene instalado por defecto en cualquier distribución Linux al uso (OpenSUSE, Ubuntu…)
  • PygreSQL, módulo Python openSource que permite la interacción con servidores PostgreSQL. Te recomiendo instalar la versión 4.11. En mi caso, tuve que instalarla mediante pip y no mediante el gestor de paquetes, que me ofrecía la versión 4.0. Es preferible la versión 4.11 que ofrece pip por disponer de ciertos métodos convenientes para manejar los resultados de las consultas.
  • Pandas, módulo Python que provee de herramientas sencillas y de alto rendimiento para análisis de datos y estructuras de datos de manejo sencillo, instalable tanto desde paquetes como a través de easy_install o pip.
  • Módulos Python xlwt y openpyxl, necesarios para que Pandas funcione correctamente. Se pueden instalar sin porblemas mediante easy_install, pip o tu gestor de paquetes. Estos son los módulos que permiten que python interaccione con archivos xls y xlsx.

Con todas estas herramientas instaladas, ya podemos ponernos a exportar datos desde PostgreSQL a excel.

PostgreSQL a excel con Python: Pasos a seguir

Los pasos que  tenemos que seguir son bastante sencillos. Exportar una tabla de una base de datos (o una consulta cualquiera, ojo) a excel mediante python es materia de sólo unas pocas líneas de código, como podréis ver

1. Importamos los módulos python necesarios y dotamos a nuestro archivo de script del sharpbang necesario para que se ejecute en nuestro sistema:

2. Creamos una conexión a la base de datos con pygresql:

3. Hacemos una consulta a la base de datos para obtener los datos que exportaremos desde PostrgreSQL a excel, también mediante las funciones de pygresql:

4. Comprobaremos si la consulta ha recuperado datos (¡Importante: si no lo hacemos, en caso de que no haya recuperado nada, tendríamos que gestionar la excepción que se generará!). Si es así, convertiremos esos datos a un objeto del tipo DataFrame de pandas, donde podremos, si la exportación desde PostgreSQL a excel lo requiriese, hacer manipulaciones adicionales sobre los datos (cálculos, etc):

Lo que hacemos aquí es indicar que el objeto DataFrame estará constituido por los datos de la consulta, que es lo que se consigue mediante datos.getresult()  y darle un nombre a las columnas del DataFrame al pasarle una tupla python de los nombres de columna mediante  datos.listfields()

Podríamos dar cualquier otro nombre de columnas si quisiéramos. Por ejemplo, al pasar datos de PostgreSQL a excel dispusiéramos de cuatro columnas y quisiéramos darles los nombres nombre, apellidos, fecha, regalo, sólo tendremos que crear una tupla python  con los nombres de las columnas y pasárselos al crear el DataFrame:

6. Exportaremos el DataFrame con los datos de nuestra base de datos PostgreSQL a excel… esto es sencillísimo ya que el objeto DataFrame de pandas dispone del método to_excel() que facilita enormemente las cosas y… ¡listos!

El parámetro index indica si se deben guardar los datos con el índice de las filas o no. Si lo hubiéramos puesto a True, la primera columna de nuestra hoja de cálculo sería ese índice, o sea, la numeración de las líneas. Esto no suele ser de interés al pasar los datos desde una base de datos cualquiera o PostgreSQL a excel.

Si empleas la extensión xls en tu archivo, se generará un archivo compatible con excel 2007, para lo que pandas necesita del módulo xlwt . Si utilizas xlsx se generará un archivo compatible con las últimas versiones de excel y pandas precisa del módulo openpyxl, de ahí la necesidad de tenerlos instalados para exportar datos de PostgreSQL a excel.

¡OJO!

Existe un problema frecuente y que no he conseguido resolver relativo a la imposibilidad de exportar datos si estos contienen caracteres acentuados y especiales. Cuando este problema te suceda al exportar a xls, exporta tus datos al formato xlsx. Parece ser la única solución por el momento.

 

Todo esto lo podemos juntar en un sencillo script:

Guardamos nuestro script en un archivo y otorgamos permisos de ejecución al script mediante  chmod +x miscript.py

Y ya está… este trozo de código se podría utilizar como parte de aplicaciones más grandes, para sacar informes desde PostgreSQL a excel. Por cierto: con otras bases de datos se procedería de igual manera. Apenas sería necesario cambiar el módulo pygresql por otro que te permita conectarte con tu base de datos preferida (MySQL, SQLite…)

 

Contar las líneas de un archivo de texto con wc

Calculadora
wc es como una calculadora antigua... y sirve para contar las líneas o las palabras de un archivo...

wc: un comando GNU/linux antiguo pero robusto para contar las líneas de un archivo… entre otras cosas

El problema

Si en alguna ocasión has necesitado contar las líneas de un archivo de texto, lo más probable es que hayas “tirado” de algún menú de propiedades del archivo, etc. en tu editor de texto habitual. Esto requiere tener el archivo abierto y cuando éste es voluminoso se puede tardar bastante en conocer un dato tan simple como este.

Vamos a contar las líneas del archivo: wc

Afortunadamente, los usuarios de GNU/Linux disponemos de un comando muy agradecido, wc (sigla que responde al término Word Count). Este comando nos permite contar las líneas (entendiendo como tal el número de caracteres nueva línea que haya en el archivo), bytes o palabras.

La sintaxis del comando, para contar las líneas, es muy sencilla:

En [ARCHIVOS] se introduce el nombre o nombres de los archivos en los que queremos efectuar la cuenta. Cuando son varios los archivos, el comando devuelve, además, una línea resumen con la suma de los conteos efectuados.

Podemos usar wc también para contar palabras, en cuyo caso se consideran como tal las secuencias de longitud no-nula delimitadas por espacios o directamente caracteres. En este caso, la llamada  sería:

Otras opciones interesantes son -c y -m, que te devuelven el número de bytes y/o caracteres del archivo, respectivamente (Ojo, hay que tener en cuenta que el carácter de fin de línea también se cuenta) y -L, que da la longitud máxima de línea (o sea, la longitud de la línea más larga).

Si empleamos wc sin archivos de entrada, el conteo se hará sobre la entrada estándar y se contará sobre lo que escribamos en consola. para salir de este modo, se pulsará Ctrl+D y el programa nos devuelve los valores que hemos pedido al invocar el comando.

Por último, os indico que si invocamos el comando sin opciones de conteo (contar las líneas, las palabras, etc), el comando nos devolverá directamente cuatro columnas: la cuenta de palabras, de líneas y de bytes totales del archivo.

Usar varias cuentas de Dropbox a la vez

Usar varias cuentas de Dropbox a la vez puede agobiar...
Usar varias cuentas de Dropbox a la vez puede agobiar...

Muchos Dropbox pueden llegar a agobiar…

Usar varias cuentas de Dropbox simultáneamente, por la razón que sea, es todo un engorro si no sabes como hacerlo. Puede que tengas tu cuenta personal y otra del trabajo, o que necesites compartir una cuenta con otra persona para intercambiar las fotos de la despedida de soltero de tu primo el de Irún. O que tienes 17 cuentas de correo más falsas que la mula del belén con sus correspondientes cuentas Dropbox asociadas para conseguir ese pedazo de disco en la nube de 50 gigas por la cara. El caso es que es una característica que cada vez es más demandada.

Soluciones

Las soluciones a este problema se basan en ejecutar varias instancias de Dropbox a la vez, pero esto no es tarea sencilla. Por eso, de las varias maneras que he probado, sólo una me ha dado buenos resultados, y he de decir que es la mejor porque es automática en cuanto a la creación de las carpetas necesarias para que varias cuentas de Dropbox funcionen a la vez.

Este método lo he sacado de la propia wiki de Dropbox y el artículo original lo podéis encontrar aquí:

http://www.dropboxwiki.com/TipsAndTricks/MultipleInstancesOnUnix

En este artículo se describen varios métodos (Atención, válido también para usuarios de Mac) para usar varias cuentas de Dropbox simultáneamente. Básicamente lo que hay que hacer es proporcionar, cada vez que ejecutamos una instancia Dropbox, de la ruta HOME para que el demonio de Dropbox haga su trabajo. Lo que hacemos es proporcionar una ruta distinta por cada dropbox que hagamos.

Un script sencillo y potente para usar varias cuentas de Dropbox

Lo que tenéis que hacer es copiar o teclear el siguiente script en un archivo de texto y ponerle de nombre multidropbox.sh, por ejemplo.

Lo bueno de este script, como dije antes, es que si os fijáis en el bloque IF es que te crea automáticamente los directorios necesarios para que cada cuenta funcione. No se limita a dos, pueden ser (en principio) cuantas desees… con tan sólo ajustar de manera apropiada la variable dropboxes con los nombres de carpeta adecuado. Por ejemplo, imaginad que queremos usar una cuenta de trabajo, otra personal y otra ultra-secreta… pues podemos modificar la variable dropboxes así:

No os olvidéis de dar permisos de ejecución a vuestro nuevo script, por ejemplo:

Con esto, no deberíais tener problemas para usar varias cuentas de Dropbox simultáneamente… ¡¡¡o eso espero!!!