Iniciar sesión

Ver la versión completa : Duda caracter raro al abrir/leer/escribir archivo utilizando python.



Dullyboy
13/03/2013, 18:57
Abro un archivo (que quiero ir modificando según se va actualizando):



historyfile = codecs.open('archivo.txt', "r", encoding='utf-8')
Y primera cosa que no entiendo porque según firefox, el txt está codificado en UTF-16 y no 8, pero si pongo 16 python me dice que "UTF-16 stream does not start with BOM")
Con esta función que copié vilmente de internet puedo ir cogiendo las lineas según van escribiendose en el txt:

def follow(thefile):
thefile.seek(0,2)
while True:
line = thefile.readline()
if not line:
time.sleep(0.1)
continue
yield line
Pero si le digo que me muestre por pantalla la linea, sale esto algo así:

G a m e s t a r t e d a t : 2 0 1 3 / 3 / 1 3
en vez de seguido como escriben las personas :).
Que de mano pensaba que eran espacios y los podría quitar fácilmente, pero es otro caracter que no me deja copiar y pegar (Si intento copiar solo copia la primera letra de la cadena y el resto no llega al portapapeles)
¿Qué caracter es para poder eliminarlo del texto y poder modificarlo a gusto o como hago para que importe el texto correctamente?
Gracias.

juanvvc
13/03/2013, 19:19
Tiene pinta que efectivamente es utf-16 pero lo estás leyendo como utf-8. En utf-16, el BOM se usa para distinguir entre big-endian y little-endian. Debido a esta línea:


thefile.seek(0,2)

Es muy posible que te estés saltando el BOM (que debería ser el primer caracter del archivo)

Posible solución: prueba a indicar explícitamente qué utf-16 es: 'utf-16be' o 'utf-16le'. No sé cuál de los dos, prueba :)

DarkDijkstra
13/03/2013, 19:37
Tiene pinta de ir por donde dice juanvvc, pero incluso creo recordar que, según con que editor hayas generado el fichero (si es que ya estaba generado de antes) a veces te guardan el BOM o no (me suena que en sistemas windows por defecto se guardaba y en linux no o cosas asi...)

De hecho, si estás en windows puedes ver los distintos tipos de codificación (con y sin BOM) en el menú "Codificación"

Dullyboy
14/03/2013, 10:49
Tiene pinta que efectivamente es utf-16 pero lo estás leyendo como utf-8. En utf-16, el BOM se usa para distinguir entre big-endian y little-endian. Debido a esta línea:


thefile.seek(0,2)

Es muy posible que te estés saltando el BOM (que debería ser el primer caracter del archivo)

Posible solución: prueba a indicar explícitamente qué utf-16 es: 'utf-16be' o 'utf-16le'. No sé cuál de los dos, prueba :)
¡¡¡Sí!!!, funciona con utf-16le, muchas gracias. Anda que no podía estar buscando por google antes de dar con eso con lo perdido que estoy en estas cosas (el utf-16be saca caracteres orientales :D).