[Python-es] Error codificación carácteres

4,234 views
Skip to first unread message

Jesús Genicio

unread,
Feb 27, 2011, 1:44:41 PM2/27/11
to pyth...@python.org
Hola a tod@s:

Llevo tiempo buscando la solución y no soy capaz. El problema es este:

BME.MC
Bolsas y Mercados Españoles
Traceback (most recent call last):
File "extraer_datos.py", line 80, in <module>
archivo_configuracion.write("set title '%s (%s)'\n"
%( Nombre_Valor,id,))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in
position 33: ordinal not in range(128)

Los datos los saco de una base de datos y tiene el formato Español, con
eñes y acentos, etc..

Pero al ejecutar este script, me tira el error y separa. ¿Qué hago mal.?


Gracias por vuestra ayuda.


_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Oscar Carballal

unread,
Feb 27, 2011, 3:11:01 PM2/27/11
to La lista de python en castellano
Has declarado el script con alguna de estas codificaciones?
iso-8859-1, iso-8859-15, latin1

En caso de que no hayas declarado la codificacion del script,
cualquier letra con tilde, o eñe dará un error y provocará que el
script se detenga.

miguel zamora m.

unread,
Feb 27, 2011, 3:36:30 PM2/27/11
to La lista de python en castellano
Estimado

Tu problema es la codificacion de los datos en la base de datos a python no le gustan los caracteres Ñ ç o acentos etc.

ejemplo de funcion datos que tienen acento y los cambia por otro sin acento
ese es mi caso

asi ve python los caracteres con acentos o que esten fuera de la tabla ascii 128
por eso tu error

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in
position 33: ordinal not in range(128)

utiliza para codificar
encode('utf-8')
y
decode('utf-8')

\xc9 =  É

def eliminarAcentos(cadena):

    d = {    '\xc1':'A',
        '\xc9':'E',
        '\xcd':'I',
        '\xd3':'O',
        '\xda':'U',
        '\xdc':'U',
        '\xd1':'N',
        '\xc7':'C',
        '\xed':'i',
        '\xf3':'o',
        '\xf1':'n',
        '\xe7':'c',
        '\xba':'',
        '\xb0':'',
        '\x3a':'',
        '\xe1':'a',
        '\xe2':'a',
        '\xe3':'a',
        '\xe4':'a',
        '\xe5':'a',
        '\xe8':'e',
        '\xe9':'e',
        '\xea':'e',       
        '\xeb':'e',       
        '\xec':'i',
        '\xed':'i',
        '\xee':'i',
        '\xef':'i',
        '\xf2':'o',
        '\xf3':'o',
        '\xf4':'o',   
        '\xf5':'o',
        '\xf0':'o',
        '\xf9':'u',
        '\xfa':'u',
        '\xfb':'u',               
        '\xfc':'u',
        '\xe5':'a'       
}
   
    nueva_cadena = cadena
    for c in d.keys():
        nueva_cadena = nueva_cadena.replace(c,d[c])

    auxiliar = nueva_cadena.encode('utf-8')
    return nueva_cadena

espero te sirva de algo el ejemplo son un problema los acentos en python asi que busca mas informacion sobre estos

Andrey Antoukh

unread,
Feb 27, 2011, 3:42:27 PM2/27/11
to La lista de python en castellano
Bueno, eso de decir que es un problema, no lo diría tanto. Trabajo a
diario con datos con acentos y no tengo ningún inconveniente, solo uno
tiene que asegurarse de trabajar siempre con unicode...

Es mas, el problema de los acentos no es de python, si no de la gente
que no usa unicode.

Como bieno se dijo en la primera respuesta, mirate la codificacion de
tu script python... la otra opcion es mirar la codificacion de
caracteres de tus variables y donde lo insertas, son muchas las
posibilidades...

Un saludo.
Andrei.

El día 27 de febrero de 2011 21:36, miguel zamora m.
<mzm...@gmail.com> escribió:

--
http://twitter.com/andsux
http://www.niwi.be
****
http://www.freebsd.org/
http://www.postgresql.org/
http://www.python.org/
http://www.djangoproject.com/

"Linux is for people who hate Windows, BSD is for people who love UNIX"
"Social Engineer -> Because there is no patch for human stupidity"

Jesús Genicio

unread,
Feb 27, 2011, 4:10:03 PM2/27/11
to La lista de python en castellano
El dom, 27-02-2011 a las 21:11 +0100, Oscar Carballal escribió:
> Has declarado el script con alguna de estas codificaciones?
> iso-8859-1, iso-8859-15, latin1
No, no he declarado nada, lo miro y ya os cuento.

Gracias.

lopz

unread,
Feb 27, 2011, 4:18:06 PM2/27/11
to La lista de python en castellano
Yo suelo utilizar esto en las 2 primeras líneas de cualquier script

#!/usr/bin/env python
# -*- coding: utf-8 -*-

Espero que solucione tu problema ya que es debido a que estás usando
caracteres no unicode en tu script
quizá en comentarios o en print's, caracteres como la ñ o tildes.

saludOS

--
lopz es libre, usa --> GNU/linux gentoo

+--[RSA 2048]--+
|  ..o.o=+       |
|   o =o*.+      |
|  . . *oO .      |
|     .EBoo      |
|      o.S         |
+--[lopz.org]--+

Jesús Genicio

unread,
Feb 27, 2011, 4:27:48 PM2/27/11
to La lista de python en castellano
El dom, 27-02-2011 a las 17:18 -0400, lopz escribió:
> Yo suelo utilizar esto en las 2 primeras líneas de cualquier script
>
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
>
> Espero que solucione tu problema ya que es debido a que estás usando
> caracteres no unicode en tu script
> quizá en comentarios o en print's, caracteres como la ñ o tildes.
>
> saludOS
>
Sigue igual:

id ->TEF.MC
Nombre_Valor-> Telefónica de España


Traceback (most recent call last):

File "extraer_datos.py", line 85, in <module>


archivo_configuracion.write("set title '%s (%s)'\n" %
( Nombre_Valor, id,))

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in
position 16: ordinal not in range(128)


S2.

Luis Miguel Morillas

unread,
Feb 27, 2011, 4:43:16 PM2/27/11
to La lista de python en castellano
El día 27 de febrero de 2011 22:27, Jesús Genicio <jgen...@gmail.com> escribió:
> El dom, 27-02-2011 a las 17:18 -0400, lopz escribió:
>> Yo suelo utilizar esto en las 2 primeras líneas de cualquier script
>>
>> #!/usr/bin/env python
>> # -*- coding: utf-8 -*-
>>
>> Espero que solucione tu problema ya que es debido a que estás usando
>> caracteres no unicode en tu script
>> quizá en comentarios o en print's, caracteres como la ñ o tildes.
>>
>> saludOS
>>
> Sigue igual:
>
> id ->TEF.MC
> Nombre_Valor-> Telefónica de España
> Traceback (most recent call last):
>  File "extraer_datos.py", line 85, in <module>
>    archivo_configuracion.write("set title '%s (%s)'\n" %
> ( Nombre_Valor, id,))
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in
> position 16: ordinal not in range(128)
>
>
Tienes que codificar la cadena para escribir en ficheros o imprimir en
la pantalla.
Supongo que esto funcionará


archivo_configuracion.write("set title '%s (%s)'\n" %(

Nombre_Valor.encode('utf-8'),id,))

o también en dos pasos:

content = "set title '%s (%s)'\n" %( Nombre_Valor, id,)
archivo_configuracion.write(content.encode('utf-8'))

-- lm

Raúl Cumplido

unread,
Feb 27, 2011, 4:44:48 PM2/27/11
to La lista de python en castellano
Con esto deberías solucionarlo:

f.write("set title '%s (%s)'\n" %( Nombre_valor.encode("utf-8"), id,))

Saludos,

Raúl

2011/2/27 Jesús Genicio <jgen...@gmail.com>



--
Raúl Cumplido

Juan de Dios Manjon Perez

unread,
Feb 27, 2011, 4:58:02 PM2/27/11
to La lista de python en castellano
Prueba a poner en la primera linea:

# -*- coding: cp1252 -*-

Saludos
Juande

Antonio Alvarado Hernández

unread,
Feb 28, 2011, 3:06:01 AM2/28/11
to La lista de python en castellano
Hola Jesús,

Los temas de encoding de tus ficheros fuente, se resuelven como bien
te han comentado Juan, lopz y Oscar (no sé si me he dejado a alguien).
Pero, si lees/escribes datos desde fichero, te toca la hacer como te
han explicado Raúl, Luis, Andrey (y seguro que se me escapa otro).

Para facilitarte la vida, puedes usar el módulo "codecs". He intentado
reproducir tu ejemplo, con este código:

# -*- coding: utf-8 -*-

from codecs import open

INPUT_ENCODING = 'cp1252'
OUTPUT_ENCODING = 'utf-8'

with open('input.dat', 'rb', INPUT_ENCODING) as infile:
with open('output.dat', 'wb', OUTPUT_ENCODING) as outfile:
while True:
inline = infile.readline()
if not inline:
break
outline = u"set title '%s (%s)'" % tuple(inline.split('\t'))
outfile.write(outline)

# EOF

Fíjate que estoy usando el "open" del módulo "codecs" no el built-in
de Python (en mi caso Python 2.7.1). También debes fijarte en que los
valores INPUT_ENCODING y OUTPUT_ENCODING, son arbitrarios: he creado
un fichero de datos de entrada (input.dat) con encoding cp1252 (el de
Windoze de toda la vida), y a partir de allí, genero un fichero de
salida (output.dat) con encoding UTF-8 (el de Linux desde hace un
tiempo pa'ca ;-). Debes ajustarlo a tus necesidades.

Saludos,
Antonio

PD: Mola el tema en el que estás medido... el de los *.MC, no el de
los encodings!

2011/2/27 Juan de Dios Manjon Perez <jua...@jdmanjon.net>:

Jesús Genicio

unread,
Feb 27, 2011, 6:31:50 PM2/27/11
to La lista de python en castellano
El dom, 27-02-2011 a las 22:44 +0100, Raúl Cumplido escribió:
> Con esto deberías solucionarlo:
>
> f.write("set title '%s (%s)'\n" %( Nombre_valor.encode("utf-8"), id,))
>
ABE.MC
None

Traceback (most recent call last):
File "extraer_datos.py", line 86, in <module>

archivo_configuracion.write("set title '%s (%s)'\n" %
( Nombre_Valor.encode("utf-8"), id,))
AttributeError: 'NoneType' object has no attribute 'encode'

No funciona de ninguna manera. ¿Debo declarar la variable Nombre_Valor
de alguna manera.?

Esta variable la asigno así:

for ids in resultado:
id= ids[ 0]
print id

cursor.execute( "select id, Nombre from cotizaciones_valores where
identidicador = ?", (id, ))
resultado= cursor.fetchone()

id_Valor= resultado[ 0]
Nombre_Valor= resultado[ 1]

S2.

Jesús Genicio

unread,
Feb 28, 2011, 2:08:15 PM2/28/11
to La lista de python en castellano
El lun, 28-02-2011 a las 09:06 +0100, Antonio Alvarado Hernández
escribió:

> Hola Jesús,
>
> Los temas de encoding de tus ficheros fuente, se resuelven como bien
> te han comentado Juan, lopz y Oscar (no sé si me he dejado a alguien).
> Pero, si lees/escribes datos desde fichero, te toca la hacer como te
> han explicado Raúl, Luis, Andrey (y seguro que se me escapa otro).
>
> Para facilitarte la vida, puedes usar el módulo "codecs". He intentado
> reproducir tu ejemplo, con este código:
>
> # -*- coding: utf-8 -*-
>
> from codecs import open
>
> INPUT_ENCODING = 'cp1252'
> OUTPUT_ENCODING = 'utf-8'
>
> with open('input.dat', 'rb', INPUT_ENCODING) as infile:
> with open('output.dat', 'wb', OUTPUT_ENCODING) as outfile:
> while True:
> inline = infile.readline()
> if not inline:
> break
> outline = u"set title '%s (%s)'" % tuple(inline.split('\t'))

He intentado utilizar tu código pero me da errores igualmente.

He adjuntado a pastebin el código completo, si alguien me puede
ayudar...

http://pastebin.com/x3DFTkjD

S2

lopz

unread,
Feb 28, 2011, 2:48:29 PM2/28/11
to La lista de python en castellano
hace poco he tenido un problema similar al tuyo y usando sqlite3, el
problema viene dado de que
estás queriendo meter un caracter que ocupa más espacio en memoria de
lo que soporta
el tipo declarado en tu DB, lo que tienes que hacer es primero al
momento de guardar el caracter o
el string en el campo tienes que hacerle un decode, y al momento de
mostrarlo en terminal y algún otro lado
le haces un encode, así no te aparecerá un símbolo raro, ya que
depende mucho en donde lo muestres y que codificación
soporta.

Bueno, lo puedes solucionar de esta manera

self.db.execute(SQL_STRING, (dork.decode('utf-8'), ))

Eso aplicas el momento de insertar tus datos o hacer un update.

Espero que te solucione el problema

saludOS

--

lopz es libre, usa --> GNU/linux gentoo

+--[RSA 2048]--+
|  ..o.o=+       |
|   o =o*.+      |
|  . . *oO .      |
|     .EBoo      |
|      o.S         |
+--[lopz.org]--+

Dr. Bobus

unread,
Feb 28, 2011, 4:41:03 PM2/28/11
to La lista de python en castellano
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El Mon, 28 Feb 2011 20:08:15 +0100
Jesús Genicio <jgen...@gmail.com> dijo:

>
> He intentado utilizar tu código pero me da errores igualmente.
>
> He adjuntado a pastebin el código completo, si alguien me puede
> ayudar...
>
> http://pastebin.com/x3DFTkjD
>


Hola Jesus:

¿En la linea 25 de tu código type(resultado[ 1]) que devuelve ??


Saludos


Dr. Bobus

- --
[In 'Doctor' mode], I spent a good ten minutes telling Emacs what I
thought of it. (The response was, 'Perhaps you could try to be less
abusive.')
(Matt Welsh)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAk1sFm8ACgkQVO2xr8e6gc5EtQCcCvB5TeeQUekZBFFSiBet2sfY
FmcAniMSpzChi92K2MKR7Vi40pcoToP/
=fs0E
-----END PGP SIGNATURE-----

Raúl Cumplido

unread,
Feb 28, 2011, 5:17:51 PM2/28/11
to La lista de python en castellano
Hola,

He creado tu ejemplo en my base de datos de test. Prueba esto a ver:

import MySQLdb
conn = MySQLdb.connect (host="localhost", user=XXXXXXXXXX, passwd=YYYYYYYYYYYYYY, db="test")
cursor = conn.cursor()
cursor.execute("select id, Nombre from cotizaciones_valores where id=1")
resultado=cursor.fetchone()
>>> print(resultado)
('1', 'telef\xc3\xb3nica Espa\xc3\xb1a')

id_Valor= resultado[0]
Nombre_Valor= resultado[1]
print(Nombre_Valor)
<<<<<<<<<<<<<<<<<< telefónica España
archivo_configuracion= open( 'gnuplot.dem', 'w')
archivo_configuracion.write("set title '%s (%s)'\n" % ( Nombre_Valor, id_Valor,))
archivo_configuracion.close()
archivo_configuracion = open('gnuplot.dem', 'r')
linea = archivo_configuracion.readline()
print(linea)
<<<<<<<<<<<<<<<<<<<set title 'telefónica España (<built-in function id>)'
archivo_configuracion.close()

Yo también estoy aprendiendo, eh! Así que si alguien ve algo que esté muy mal que avise, xD!

Saludos,

Raúl

2011/2/28 Dr. Bobus <drb...@gulic.org>



--
Raúl Cumplido

Raúl Cumplido

unread,
Feb 28, 2011, 5:19:18 PM2/28/11
to La lista de python en castellano
Me he colado, el útlimo print da lo siguiente (errores del copy&paste):

>>> print(linea)
set title 'telefónica España (1)'

Saludos,

Raúl

2011/2/28 Raúl Cumplido <raulcu...@gmail.com>



--
Raúl Cumplido

Jesús Genicio

unread,
Feb 28, 2011, 5:59:09 PM2/28/11
to La lista de python en castellano
El lun, 28-02-2011 a las 21:41 +0000, Dr. Bobus escribió:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> El Mon, 28 Feb 2011 20:08:15 +0100
> Jesús Genicio <jgen...@gmail.com> dijo:
>
> >
> > He intentado utilizar tu código pero me da errores igualmente.
> >
> > He adjuntado a pastebin el código completo, si alguien me puede
> > ayudar...
> >
> > http://pastebin.com/x3DFTkjD
> >
>
>
> Hola Jesus:
>
> ¿En la linea 25 de tu código type(resultado[ 1]) que devuelve ??

ABE.MC
Salida de nombre ->>[<type 'unicode'>]
Llamando a subproceso GnuPlot

set title '<type 'unicode'> (ABE.MC)'
^

S2.

gerardo Juarez

unread,
Feb 28, 2011, 6:41:07 PM2/28/11
to La lista de python en castellano
Una pregunta: qué codificación tiene tu base de datos?

lopz

unread,
Feb 28, 2011, 6:50:39 PM2/28/11
to La lista de python en castellano
Yo es que le he respondido con lo que he solucionado el mismo problema
pero a pasado de la ayuda
lo que le queda es leer [1] por ahí es su problema

[1] http://docs.python.org/library/sqlite3.html#sqlite3.Connection.text_factory

El día 28 de febrero de 2011 19:41, gerardo Juarez
<gerard...@buyteknet.info> escribió:

--

lopz es libre, usa --> GNU/linux gentoo

+--[RSA 2048]--+
|  ..o.o=+       |
|   o =o*.+      |
|  . . *oO .      |
|     .EBoo      |
|      o.S         |
+--[lopz.org]--+

Jesús Genicio

unread,
Mar 1, 2011, 1:25:47 AM3/1/11
to La lista de python en castellano
El lun, 28-02-2011 a las 19:50 -0400, lopz escribió:
> Yo es que le he respondido con lo que he solucionado el mismo problema
> pero a pasado de la ayuda
> lo que le queda es leer [1] por ahí es su problema

No he pasado, solo es que no tengo muchi tiempo, lo estoy intentando y
os agradezco la ayuda. En cuanto tenga resultados, os comento.

Muchas gracias compañeros.

Gustavo Cabral

unread,
Mar 1, 2011, 5:44:56 AM3/1/11
to La lista de python en castellano
Yo lo he solucionado con:

unicode("la cadena").encode("utf-8")

Saludos!

Gustavo.-
--

Linux es Libertad

Jesús Genicio

unread,
Mar 1, 2011, 3:12:11 PM3/1/11
to La lista de python en castellano
El mar, 01-03-2011 a las 07:44 -0300, Gustavo Cabral escribió:
> unicode("la cadena").encode("utf-8")

Perfecto, esto si me ha funcionado.

¡¡¡Muuchas gracias!!!
>
>

ABE.MC_a_2_semana.png

lopz

unread,
Mar 1, 2011, 6:11:26 PM3/1/11
to La lista de python en castellano
Es lo que te había dicho hace tiempo :)

self.db.execute(SQL_STRING, (dork.decode('utf-8'), ))

Me pasó lo mismo, por eso te lo puse, pero que bueno que lo resolviste

> _______________________________________________
> Python-es mailing list
> Pyth...@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>

--

lopz es libre, usa --> GNU/linux gentoo

+--[RSA 2048]--+
|  ..o.o=+       |
|   o =o*.+      |
|  . . *oO .      |
|     .EBoo      |
|      o.S         |
+--[lopz.org]--+

Jesús Genicio

unread,
Mar 2, 2011, 1:23:26 AM3/2/11
to La lista de python en castellano
El mar, 01-03-2011 a las 19:11 -0400, lopz escribió:
> Es lo que te había dicho hace tiempo :)
>
> self.db.execute(SQL_STRING, (dork.decode('utf-8'), ))
>
> Me pasó lo mismo, por eso te lo puse, pero que bueno que lo resolviste

¿Realmente es lo mismo.?


self.db.execute(SQL_STRING, (dork.decode('utf-8'), ))

unicode("la cadena").encode("utf-8")

S2.

Reply all
Reply to author
Forward
0 new messages