Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados

Charla: Entendiendo Decoradores en Python [actualizada]

La primer vez que di esta charla fue en el PyDay de Rafala en 2010. De las charlas que tengo en la gatera, es la que más me gusta de momento. Está bien armada y es muy útil para quienes empiezan con Python. Por eso cuando me invitaron a dar una charla en el PyDay de Córdoba, no dude en presentarla.

Dejo on line la versión actualizada (y sus fuentes) ya que los estuve buscando antes de dar la charla y me costó encontrarlos en mi computadora. Subiéndolas a Internet aumento su disponibilidad.

Esta charla también fue dada en PyCon Argentina 2010.



Python: guardar imagenes en una base de datos Sqlite

Hace un par de días Walter de Nicaragua me consultaba:

Estoy trabajando en una aplicacion para niños en las xo´s , estoy usando sqlite3 para guardar la informacion, y tambien necesito guardar fotos dentro de la base de datos.

Como la fotos seran tomadas con la camara de las propias XO's, asumo no son tan grande en resolucion y tamaño.

Tambien, estuve revizando la lista de correo, pero no hay nada concreto, y a decir verdad recomiendan que guarde una referencia de la imagen en la base de datos, y luego haga una consulta, para recuperarla, pero tambien he visto que tiene sus pro y sus contras.

Esta es la respuesta. Primero necesitamos una tabla con un campo de tipo BLOB donde guardar la imagen:

>>> import sqlite3

>>> conn = sqlite3.connect('/tmp/example')

>>> c = conn.cursor()

>>> c.execute('''create table imagenes (imagen BLOB);''')

Abro una imagen que tengo en disco, mismo directorio que donde ejecute

el intérprete de Python, la cargo en memoria y la guardo en la base.

>>> imgdata = open('tomyNarnia.jpg', 'r').read()

>>> len(imgdata)

1613949

>>> buff = sqlite3.Binary(imgdata)

>>> c.execute('insert into imagenes values(?);', (buff,))

>>> conn.commit()

>>> conn.close()

Luego podemos cerrar el intérprete. Con sqlite3 importado, recuperamos

la imagen.

>>> conn = sqlite3.connect('/tmp/example')

>>> c = conn.cursor()

>>> a = c.execute('select imagen from imagenes')

>>> img = a.fetchone()

>>> len(img)

1

>>> img

(<read-write buffer ptr 0x1c75d60, size 1613949 at 0x1c75d20>,)

El resultado es una tupla, pero como seleccionamos un solo campo de la

tabla, hay un solo elemento.

>>> img = img[0]

>>> len(img)

1613949

Finalmente lo escribimos en una imagen.

>>> f = open('newimage.jpg', 'w')

>>> f.write(img)

>>> f.close()


Unicode en el código fuente

Hoy Pedro preguntó en Twitter "Que lenguajes de programación permiten a día de hoy soporte full unicode para codear?". Algunos contestaron que Java o C#. No los conozco, pero creo que no. Creo que respondieron que el lenguaje puede trabajar con strings unicode, lo cual es bastante común hoy en día. Mi respuesta fue: Python 3. Con Python 3 podemos tener caracteres unicode en el código fuente, en el nombre de las variables por ejemplo:

>>> á = 1

>>> print(á)

1

>>> 大家好 = range(10)

>>> for ä in 大家好:

... print(ä)

...

0

1

2

3

4

5

6

7

8

9

>>> año = 2027

>>> año += 1

>>> print(año)

2028