2010-03-31 8 views
5

Estoy procesando un archivo UTF-8 en Python, y he usado simplejson para cargarlo en un diccionario. Sin embargo, yo estoy poniendo un UnicodeDecodeError cuando intento de convertir uno de los valores del diccionario en una cadena:Python: ¿por qué str() en algún texto de un archivo UTF-8 da un UnicodeDecodeError?

f = open('my_json.json', 'r') 
master_dictionary = json.load(f) 
#some json wrangling, then it fails on this line... 
mysql_string += " ('" + str(v_dict['code']) 
Traceback (most recent call last): 
    File "my_file.py", line 25, in <module> 
    str(v_dict['code']) + "'), " 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf4' in position 35: ordinal not in range(128) 

¿Por qué Python incluso utilizando ASCII? Pensé que usaba UTF-8 por defecto, y la entrada es de un archivo UTF-8.

$ file my_json.json 
my_json.json: UTF-8 Unicode English text 

¿Cuál es el problema?

Respuesta

6

Python 2.x utiliza ASCII de forma predeterminada . unicode.encode() utilizar si desea convertir una unicode en un str:

v_dict['code'].encode('utf-8') 
+0

Gracias! Para codificar todos los elementos en el diccionario, lo hice: para k, v en v_dict.iteritems(): si v_dict [k]: v_dict [k] = v_dict [k] .encode ('utf-8') – AP257

2

Una manera de hacer este trabajo sería la de establecer la codificación por defecto a UTF-8 de forma explícita, como:

import sys 
sys.setdefaultencoding("utf-8") 

Esto podría conducir a consecuencias no deseadas si no quiere que todo sea Unicode de manera predeterminada .

una forma más limpia podría ser el uso de la función unicode en lugar de str:

mysql_string += " ('" + unicode(v_dict['code'])

o especificar la codificación de forma explícita:

mysql_string += " ('" + unicode(v_dict['code'], "utf-8")

Cuestiones relacionadas