PDA

Ver la versión completa : [Ayuda] alguien que sepa de Python??



jmmanson
10/05/2011, 13:10
Tengo un problemilla y es que no se nada de python y me he encontrado con una base de datos hecha en este lenguaje. tiene un problema que al exportar el resultado de una busqueda a excel me sale el siguiente error:


Page handler: <function _wrapper at 0xb6d1980c>
Traceback (most recent call last):
File "/usr/lib/python2.4/site-packages/CherryPy-2.2.1-py2.4.egg/cherrypy/_cphttptools.py", line 105, in _run
self.main()
File "/usr/lib/python2.4/site-packages/CherryPy-2.2.1-py2.4.egg/cherrypy/_cphttptools.py", line 254, in main
body = page_handler(*virtual_path, **self.params)
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/identity/conditions.py", line 275, in _wrapper
return fn( *args, **kw )
File "<string>", line 3, in doInvitadosPorEntidad
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/controllers.py", line 334, in expose
output = database.run_with_transaction(
File "<string>", line 5, in run_with_transaction
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/database.py", line 302, in so_rwt
retval = func(*args, **kw)
File "<string>", line 5, in _expose
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/controllers.py", line 351, in <lambda>
mapping, fragment, args, kw)))
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/controllers.py", line 378, in _execute_func
output = errorhandling.try_call(func, *args, **kw)
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/errorhandling.py", line 73, in try_call
return func(self, *args, **kw)
File "<string>", line 3, in doInvitadosPorEntidad
File "/usr/lib/python2.4/site-packages/TurboGears-1.0.1-py2.4.egg/turbogears/paginate.py", line 47, in decorated
output = func(*args, **kw)
File "/home/administrador/festibase/tg/Festibase/festibase/ConsultasInvitadosController/controllers.py", line 3034, in doInvitadosPorEntidad
return self.invitados2CSVpeque(resultado)
File "/home/administrador/festibase/tg/Festibase/festibase/ConsultasInvitadosController/controllers.py", line 4102, in invitados2CSVpeque
f.write(campoCSV(r.entidad.direccion)+';')
File "codecs.py", line 501, in write
return self.writer.write(data)
File "codecs.py", line 178, in write
data, consumed = self.encode(object, self.errors)
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 15: ordinal not in range(256)

parece ser que no puede convertir un caracter especial u'\u2013' de latin-1 a otro (supongo que a utf-8)

alguien puede ayudarme??

DarkDijkstra
10/05/2011, 13:53
Sin ver el fuente no se puede saber al 100%, pero lo que dice ahi es que está intentando codificar a "latin-1" (que usa un byte por caracter) el caracter unicode "\u2013" (que usa dos bytes) en la llamada a

data, consumed = self.encode(object, self.errors)

parece que en la base de datos se están guardando cadenas unicode pero la aplicación no está configurada para tener soporte unicode

de todos modos, haría falta saber realmente que base de datos hay por debajo, que ahi se intuye el framework de turbogears, pero poco más... : S

sólo te da ese problema con alguna consulta en particular? siempre? antes no daba y ahora si?

jmmanson
10/05/2011, 14:03
si, es turbogears el framework que tiene. El problema parece que se da porque en algun dato de la BD que se debe mostar en la consulta tiene ese caracter especial, en otras consultas no da el fallo. el fallo supongo que lo dará desde que han metido ese dato especifico.

no sabes lo que agradezco tu ayuda, muchas gracias.

DarkDijkstra
10/05/2011, 14:29
Pues asi medio inventandome un poco el tema, porque sin tener el codigo fuente es un poco difcil... ; )

Diria que en el fichero /home/administrador/festibase/tg/Festibase/festibase/ConsultasInvitadosController/controllers.py hay un método que es invitados2CSVpeque que (asumo) abrirá un fichero (me la jugaría, viendo el punto y coma) .csv (que luego se puede ver en excel), y luego dentro de un bucle, va obteniendo valores y llamando a f.write(campoCSV(r.entidad.direccion)+';') que lo que hace es ir escribiendo en ese fichero de salida un valor determinado

(todo esto es pura especulación, ojo...)

si tienes acceso al codigo, edita ese método, y cuando se abra / genere el fichero .csv (asumiendo, asumiendo... ; ) habrá una linea tipo f = open("nombre_fichero", "w"), intenta cambiarla a algo tipo f = open("nombre_fichero", "w", "utf-8") por ejemplo

otra solución (parche más bien) sería coger la linea f.write(campoCSV(r.entidad.direccion)+';') y cambiarla por un bloque tipo:

try:

f.write(campoCSV(r.entidad.direccion)+';')
except UnicodeEncodeError:

f.write("error en el valor procesado;")

(ojo con las indentaciones en python)

eso lo que haría es, en caso de error de conversión de esa celda del excel, escribir ese valor por defecto... al menos asi "no debería petar"

a ver si con algo de eso puedes avanzar... animo !

jmmanson
10/05/2011, 14:55
MUCHAS GRACIAS!!!

encontre esta linea

f = open("nombre_fichero", "w", "latin-1") la he cambiado por utf-8 y ya me genera el csv,

no se si luego me tendre problemas de Ñ o algo asi pero ahora mismo me saca del apuro, pues lo que necesito es un listado de email y estos no tienen caracteres especiales.

De nuevo muchas gracias, porque estaba mareadismo, entre que no conozco el lenguaje y el que hizo el programa lo hizo con muchisimos archivos que se llaman unos a otros...

GRACIAS!!!

DarkDijkstra
10/05/2011, 17:30
De nada, a mandar !! :brindis: