utf8 unicodedecodeerror open not 0xff 0xe2 0xc3 python django utf-8

python - open - UnicodeDecodeError: el códec ''ascii'' no puede decodificar el byte 0xd1 en la posición 2: el ordinal no está dentro del rango(128)



unicodedecodeerror ascii codec can t decode byte 0xe2 in position 1 ordinal not in range 128 (5)

Estoy intentando trabajar con un conjunto de datos muy grande que tiene algunos caracteres no estándar. Necesito usar Unicode, según las especificaciones del trabajo, pero estoy desconcertado. (Y muy posiblemente haciendo todo mal).

Abro el CSV usando:

15 ncesReader = csv.reader(open(''geocoded_output.csv'', ''rb''), delimiter=''/t'', quotechar=''"'')

Luego, intento codificarlo con:

name=school_name.encode(''utf-8''), street=row[9].encode(''utf-8''), city=row[10].encode(''utf-8''), state=row[11].encode(''utf-8''), zip5=row[12], zip4=row[13],county=row[25].encode(''utf-8''), lat=row[22], lng=row[23])

Estoy codificando todo, excepto el lat y el lng porque deben enviarse a una API. Cuando ejecuto el programa para analizar el conjunto de datos en lo que puedo usar, obtengo el siguiente Traceback.

Traceback (most recent call last): File "push_into_db.py", line 80, in <module> main() File "push_into_db.py", line 74, in main district_map = buildDistrictSchoolMap() File "push_into_db.py", line 32, in buildDistrictSchoolMap county=row[25].encode(''utf-8''), lat=row[22], lng=row[23]) UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xd1 in position 2: ordinal not in range(128)

Creo que debería decirte que estoy usando Python 2.7.2, y esto es parte de una compilación de aplicaciones en django 1.4. He leído varias publicaciones sobre este tema, pero ninguna de ellas parece aplicarse directamente. Cualquier ayuda será apreciada.

También es posible que desee saber que algunos de los caracteres no estándar que causan el problema son Ñ y posiblemente É.


La razón principal del error es que la codificación predeterminada asumida por python es ASCII. Por lo tanto, si los datos de cadena codificados por encode(''utf8'') contienen caracteres que están fuera del rango ASCII, por ejemplo, para una cadena como ''hgvcj 터 파크 387'', python arrojaría un error porque la cadena no está en el formato de codificación esperado .

Si está utilizando la versión de Python anterior a la versión 3.5, una solución confiable sería establecer la codificación predeterminada asumida por python para utf8 :

import sys reload(sys) sys.setdefaultencoding(''utf8'') name = school_name.encode(''utf8'')

De esta forma, Python podría anticipar caracteres dentro de una cadena que caiga fuera del rango ASCII.

Sin embargo, si está utilizando la versión 3.5 de Python o superior, la función reload () no está disponible, por lo que tendría que arreglarlo usando decodificación por ej.

name = school_name.decode(''utf8'').encode(''utf8'')


Para usuarios de Python 3:

cambiar la codificación de ''ascii'' a ''latin1'' funciona.

Además, puede intentar encontrar la codificación automáticamente leyendo los mejores 10000 bytes usando el siguiente fragmento:

import chardet with open("dataset_path", ''rb'') as rawdata: result = chardet.detect(rawdata.read(10000)) print(result)


Solo agrega estas líneas a tus códigos:

import sys reload(sys) sys.setdefaultencoding(''utf-8'')


Unicode no es igual a UTF-8. El último es solo una codificación para el primero.

Lo estás haciendo mal. Está leyendo datos codificados en UTF-8, por lo que debe decodificar la cadena codificada en UTF-8 en una cadena unicode.

Así que simplemente reemplace .encode con .decode , y debería funcionar (si su .csv está codificado en UTF-8).

No hay nada de qué avergonzarse, sin embargo. Apuesto a que 3 de cada 5 programadores tuvieron problemas para entender esto primero, si no más;)

Actualización: si sus datos de entrada no están codificados en UTF-8, entonces tiene que .decode() con la codificación adecuada, por supuesto. Si no se proporciona nada, Python asume ASCII, que obviamente falla en caracteres que no son ASCII.


para usuarios de Python 3. tu puedes hacer

with open(csv_name_here, ''r'', encoding="utf-8") as f: #some codes

funciona con matraz también :)