Exportando BLOBs a archivos jpeg (pyodbc + PIL)
Amm-Python
python en ammsoft.com
Lun Jun 12 12:14:34 CEST 2006
> AttributeError: 'buffer' object has no attribute 'read'
A mi me pasaba esto si intentaba guardar directamente los datos del
recordset.
Pero se solucionaba asignando el blob a una nueva variable.
Cosa que ya haces, por lo que debería funcionar.
La única razón por la que el objeto no pueda tener el atributo read es
que no contiene una imagen, o mejor dicho; no contiene la información
que él espera.
Yo estoy utilizando:
Python 2.4
cx_Oracle
Y las imágenes, que son jpg, se guardan en un campo tipo Blob.
Realmente el lío lo tuve al tener que guardarlas, ya que en Oracle había
que preparar el campo.
La variable donde asigno la foto leída, creo, es tratada como
StreamRead, por lo que tiene el atributo read.
No se si en una base de datos Access, conectados bajo ODBC, ese tipo de
campos es tratado de igual forma.
Habría que ver los atributos del campo (tipo, longitud del
contenido,..).
Te adjunto algunos trozos de código que yo utilizo y que están
funcionando desde hace más de un año.
sql = 'select fot_imagen from empleados where fot_id=:id'
valores= {'id' : '12345678'}
# run the query
try:
cursor.execute(sql,valores)
except (Exception),e:
print e
ft = cursor.fetchone()
buff_foto = ft[0] #paso imprescindible
#no se porqué pero buff_foto tiene el atributo read()
#puede que sea alguna característica de Oracle.
filename = '12345678'
dir = 'c:/fotos'
#guardar foto
if buff_foto != None:
SaveFoto(dir, filename, buff_foto)
def SaveFoto(dir, filename, buffer):
"""
Guarda el buffer en el directorio y fichero especificado.
"""
destino = dir + "\\" + filename +".jpg"
try:
file(destino, 'wb').write(buffer.read())
except (Exception), e:
print e
Si de aquí al fin de semana tengo un momento intentaré probarlo en
Access.
> -----Mensaje original-----
> De: python-es-bounces en aditel.org [mailto:python-es-bounces en aditel.org]
> En nombre de javiVF Enviado el: dilluns, 12 / juny / 2006 10:11
> Para: La lista de python en castellano
> Asunto: Re: [Python-es] Exportando BLOBs a archivos jpeg (pyodbc +
> PIL)
>
>
> Hola Toni,
>
> Amm-Python escribió:
> > En teoría basta con:
> >
> > fiel('test.jpg', 'wb').write(imagen.read())
> He probado tu propuesta ( supongo que querías escribir file en lugar
> de fiel ;) y me da el siguiente error:
>
> AttributeError: 'buffer' object has no attribute 'read'
>
> ¿ A que tipo de objeto debería cambiar para poder trabajar con el
> 'read' ?
>
> > Partiendo de la premisa de que, realmente, en el campo blob
> tienes la
> > imagen en formato jpg.
> >
> > No se para que quieres especificar el tamaño, ya que cuando la
> > incluyas en reporlab puedes ajustarlo fácilmente.
> >
> >
> Por nada en especial, simplemente por que es necesario para el método
> 'frombuffer', o eso creo...
> > Saludos,
> > Toni
> >
> >
> Saludos y gracias por responder
> >> -----Mensaje original-----
> >> De: python-es-bounces en aditel.org
> >> [mailto:python-es-bounces en aditel.org] En nombre de javiVF Enviado
> >> el: divendres, 9 / juny / 2006 18:56
> >> Para: python-es en aditel.org
> >> Asunto: [Python-es] Exportando BLOBs a archivos jpeg (pyodbc + PIL)
> >>
> >>
> >> Buenas,
> >>
> >> Tengo un pequeño problema para convertir imágenes embebidas en una
> >> BBDD MS Access a archivos jpeg ( por ejemplo ) Os explico lo que
> >> hago para obtener el archivo jpg del BLOB:
> >>
> >> import pyodbc as dbi
> >> import pyodbc
> >> import Image
> >>
> >> cnxn = pyodbc.connect("DSN=pyJRA;UID=Admin;PWD=")
> >> row = cnxn.execute("select * from dibujos where codigo =
> >> '0870160Z'").fetchone()
> >>
> >> imagen =row[2]
> >>
> >> im = Image.frombuffer("L",(120,120),imagen,"raw")
> >> im.save("test.jpg")
> >>
> >> Se crea la imagen pero no es lo que corresponde a lo que hay en la
> >> base de datos. También he probado pasandole los modos "1", "RGB" y
> "CMYK" al método
> >> frombuffer pero con el mismo resultado.
> >> La verdad es que estoy bastante encallado en el tema y agradecería
> >> cualquier comentario :)
> >>
> >> PD: La imagen la tengo que utilizar después para incluirla
> en un pdf
> >> usando el reportlab, lo comento por si alguien sabe como
> usar BLOB's
> >> directamente en el reportlab sin tener que usar un archivo temporal
> >> como intento hacer yo.
> >>
> >> --
> >> |_|0|_| javiVF
> >> |_|_|0|
> >> |0|0|0|
> >>
> >> _______________________________________________
> >> Python-es mailing list
> >> Python-es en aditel.org http://listas.aditel.org/listinfo/python-es
> >>
> >>
> >
> > _______________________________________________
> > Python-es mailing list
> > Python-es en aditel.org http://listas.aditel.org/listinfo/python-es
> >
> >
>
>
> --
> |_|0|_| javiVF
> |_|_|0|
> |0|0|0|
>
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org http://listas.aditel.org/listinfo/python-es
>
Más información sobre la lista de distribución Python-es