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 posiblemente haciéndolo 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 lat y 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 aplicación desarrollada en django 1.4. He leído varias publicaciones sobre este tema, pero ninguna 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 É.
Respuestas:
Unicode no es igual a UTF-8. El último es solo una codificación del primero.
Lo estás haciendo al revés. 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 reemplácelo
.encode
con.decode
, y debería funcionar (si su .csv está codificado en UTF-8).Sin embargo, no hay nada de qué avergonzarse. Apuesto a que 3 de cada 5 programadores tuvieron problemas al principio para entender esto, si no más;)
Actualización: si sus datos de entrada no están codificados en UTF-8, entonces debe hacerlo
.decode()
con la codificación adecuada, por supuesto. Si no se da nada, python asume ASCII, que obviamente falla en caracteres que no son ASCII.fuente
.decode('utf-8')
debería funcionar, ¿no?Simplemente agregue estas líneas a sus códigos:
fuente
para usuarios de Python 3. tu puedes hacer
también funciona con matraz :)
fuente
La razón principal del error es que la codificación predeterminada asumida por Python es ASCII. Por lo tanto, si los datos de la cadena que se codificarán
encode('utf8')
contienen un carácter que está fuera del rango ASCII, por ejemplo, para una cadena como 'hgvcj 터 파크 387', Python arrojaría un error porque la cadena no tiene el formato de codificación esperado.Si está utilizando una 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 en
utf8
:De esta manera, Python podría anticipar caracteres dentro de una cadena que caen fuera del rango ASCII.
Sin embargo, si está utilizando Python versión 3.5 o superior, la función reload () no está disponible, por lo que tendría que solucionarlo usando decode, por ejemplo
fuente
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 10000 bytes superiores utilizando el siguiente fragmento:
fuente
Mi computadora tenía la configuración regional incorrecta.
Primero hice
locale.getpreferredencoding(False)
es la función llamada poropen()
cuando no proporcionas una codificación . La salida debería ser'UTF-8'
, pero en este caso es una variante de ASCII .Luego ejecuté el comando bash
locale
y obtuve esta salidaEntonces, estaba usando la configuración regional predeterminada de Ubuntu, lo que hace que Python abra archivos como ASCII en lugar de UTF-8. Tuve que poner mi local a
en_US.UTF-8
Si no puede cambiar la configuración regional en todo el sistema, puede invocar todo su código Python de esta manera:
o hacer
para configurarlo en el shell en el que lo ejecuta.
fuente
Si tiene este problema mientras ejecuta certbot mientras crea o renueva el certificado, utilice el siguiente método
grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx
Ese comando encontró el carácter ofensivo "´" en un archivo .conf en el comentario. Después de eliminarlo (puede editar los comentarios como desee) y volver a cargar nginx, todo volvió a funcionar.
Fuente: https://github.com/certbot/certbot/issues/5236
fuente
O cuando trabaje con texto en Python si es un texto Unicode, tome nota de que es Unicode.
En su
text=u'unicode text'
lugar, establezca solotext='unicode text'
.Esto funcionó en mi caso.
fuente
abierto con codificación UTF 16 debido a lat y long.
fuente
Funciona simplemente tomando el argumento 'rb' read binary en lugar de 'r' read
fuente