2011-01-19 26 views
6

Estoy tratando de decodificar una cadena que tomé de archivo:pitón: problema Unicode

file = open ("./Downloads/lamp-post.csv", 'r') 
data = file.readlines() 
data[0] 

'\ xff \ xfeK \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ x00 \ t \ x00C \ x00o \ x00m \ x00p \ x00e \ x00t \ x00i \ x00t \ x00i \ x00o \ x00n \ x00 \ t \ x00G \ x00l \ x00o \ x00b \ x00a \ x00l \ x00 \ x00M \ x00o \ x00n \ x00t \ x00h \ x00l \ x00y \ x00 \ x00S \ x00e \ x00a \ x00r \ x00c \ x00h \ x00e \ x00s \ x00 \ t \ x00D \ x00e \ x00c \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00N \ x00o \ x00v \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00O \ x00c \ x00t \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00S \ x00e \ x00p \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00A \ x00u \ x00g \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00u \ x00l \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00u \ x00n \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00M \ x00a \ x00y \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00A \ x00p \ x00r \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00M \ x00a \ x00r \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00F \ x00e \ x00b \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00a \ x00n \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00A \ x00d \ x00 \ x00s \ x00h \ x00a \ x00r \ x00e \ x00 \ t \ x00e \ x00e \ x00a \ x00r \ x00c \ x00h \ x00 \ x00s \ x00h \ x00a \ x00r \ x00e \ x00 \ t \ x00E \ x00s \ x00t \ x00i \ x00m \ x00a \ x00t \ x00e \ x00d \ x00 \ x00A \ x00v \ x00g \ x00. \ x00 \ x00C \ x00P \ x00C \ x00 \ t \ x 00E \ x00x \ x00t \ x00r \ x00a \ x00c \ x00t \ x00e \ x00d \ x00 \ x00F \ x00r \ x00o \ x00m \ x00 \ x00W \ x00e \ x00b \ x00 \ x00P \ x00a \ x00g \ x00e \ x00 \ t \ x00L \ x00o \ x00c \ x00a \ x00l \ x00 \ x00M \ x00o \ x00n \ x00t \ x00h \ x00l \ x00y \ x00 \ x00S \ x00e \ x00a \ x00r \ x00c \ x00h \ x00e \ x00s \ x00 \ n '

Adición de ignorar realmente no ayuda ...:

En [69]: los datos [2] de salida [69]: u' \ u6700 \ u6100 \ U7200 \ u6400 \ u6500 \ u6e00 \ u2000 \ u6c00 \ u6100 \ u6d00 \ u7000 \ u2000 \ u7000 \ u6f00 \ u7300 \ u7400 \ u0900 \ u3000 \ u2e00 \ u3900 \ u3400 \ u0900 \ u3800 \ u3800 \ u3000 \ u0900 \ u2d00 \ u0900 \ u3300 \ u3200 \ u0000 \ u0000 \ u0000 \ u3900 \ u0000 \ u0000 \ u0000 \ u3900 \ u0000 \ u000000 u0000 \ u3400 \ u3800 \ u3000 \ u0900 \ u3500 \ u3900 \ u00300 u009 \ u3500 \ u3900 \ u0000 \ u0000 \ u3700 \ u3200 \ u0000 \ u0000 \ u3700 \ u3200 \ u000000 u0000 \ u0000 \ u3900 \ u000000 u009 \ u00300 u0000 \ u00300 u0000 \ u0000 \ u3200 \ u3600 \ u000000 u0000 \ u2d00 \ u0900 \ u2d00 \ u0900 \ UA300 \ U3200 \ u2e00 \ U3100 \ u3800 \ u0900 \ u2d00 \ u0900 \ U3400 \ u3800 \ u3000 \ u0a00'

En [70]: datos [2] .decode ("UTF-8", "reemplazar") -------------------------------------------- ------------------------------- Traza (última llamada más reciente)

/Usuarios/oleg/en ()

/opt/local/lib/python2.5/encodings/utf_8.py en decode (entrada, errores) 15 decodificar def (entrada, 'estrictas' errors =): ---> 16 codecs de retorno .utf_8_decode (entrada, errores, True) 18 clase IncrementalEncoder (codecs.IncrementalEncoder):

: codec 'ascii' no puede codificar caracteres en la posición 0-87: no ordinal en gama (128)

En [71]:

+0

Mi respuesta funciona sin el error. Pero depende de si desea ignorar o reemplazar los caracteres no codificados. – orlp

Respuesta

14

esto se parece a los datos UTF-16. Así que trate de

data[0].rstrip("\n").decode("utf-16") 

Edit (para su actualización): Trata de descifrar el archivo completo de una sola vez, es decir

data = open(...).read() 
data.decode("utf-16") 

El problema es que los saltos de línea en UTF-16 son "\ n \ x00 ", pero usando readlines() se dividirá en" \ n ", dejando el carácter" \ x00 "para la siguiente línea.

+0

¡Eso funcionó! Solo necesita corregir el error en el segundo operando (por lo que es rstrip) –

+0

Extraño, falla para la siguiente línea: –

+0

¡¡Finalmente funcionó !!! –

3

EDITAR

Ya que registró 2,7 ésta es la solución 2.7:

file = open("./Downloads/lamp-post.csv", "r") 
data = [line.decode("utf-16", "replace") for line in file] 

Ignorar caracteres: undecodeable

file = open("./Downloads/lamp-post.csv", "r") 
data = [line.decode("utf-16", "ignore") for line in file] 
+0

En [21]: file = open ("./Downloads/lamp-post.csv", 'r') En [22]: data = [line.decode() para la línea en el archivo] --- -------------------------------------------------- ---------------------- Traceback (última llamada más reciente) /Users/oleg/ en () : codec 'ascii' no puede decodificar 0xff byte en la posición 0: no ordinal en el rango (128) en [23]: datos = [line.decode() para línea en archivo] –

+0

Ohh, ¿quieres ignorar esos caracteres inválidos o reemplazarlos? Edité mi respuesta asumiendo el reemplazo. – orlp

+0

O UTF-16. _15char_ – orlp

4

Este archivo es un archivo codificado en UTF-16-LE, con una lista de materiales inicial.

import codecs 

fp= codecs.open("a", "r", "utf-16") 
lines= fp.readlines() 
+0

-1 balderdash. >>> raw = '\ xff \ xfeo \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ x00' >>> raw.decode ('utf_16le') u '\ ufeffKeyword' >>> raw.decode ('utf_16') u'Keyword ' >>> –

+0

@John: gracias por la corrección. – tzot

+0

@ ΤΖΩΤΖΙΟΥ: De ​​nada. –