Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Hechelion en 29 de Junio de 2011, 11:52:01 AM

Título: replace null en python 3.2
Publicado por: Hechelion en 29 de Junio de 2011, 11:52:01 AM
Buenas, en python 2.6 usaba la función replace de los string para sacar los caracteres nulos que obtengo al leer un archivo binario.


        s1 = f.read(24)
        a1 = struct.unpack("16s l h h", s1)
        temp = str(a1[0]).replace('\0','')


Como muestra el código, obtengo los primeros 16 bytes de un chunk de 24, esos 16 corresponden al nombre del archivo, y con
str(a1[0]).replace('\0','') lo convierto a un string, al cual le reemplazo los caracteres nulos para que me retorne solo el nombre. Ese código en python 2.6 me funciona perfecto.


>c:\Python26\python searchHAK.py nw2old
>nw2oldowlwell.mdl
>nw2oldowlwell.pwk


Cuando intento correr el script en python 3.2, el código funciona y no me arroja error, pero no me reemplaza los caracteres nulos y además me agrega unas comillas y una letra b al inicio y no tengo la menor idea de porque hace eso.

>c:\Python32\python searchHAK.py nw2old
>b'nw2oldowlwell\x00\x00\x00'.mdl
>b'nw2oldowlwell\x00\x00\x00'.pwk


Llevo varias horas buscando en la red, y no logro encontrar que hay de malo o como adaptar el código para que funcione bien en 3.2. Si alguien me pueda dar una mano se lo agradecería.
Título: Re: replace null en python 3.2
Publicado por: Hechelion en 30 de Junio de 2011, 04:24:56 AM
Sigo sin entender porque el replace dejó de funcionar en 3.2 (por lo menos para los caracteres especiales), si algún gurú de python 3.2 me puede explicar el porque se lo agradecería

Por mientras, explico como lo solucione, por si le sirve a alguien más.
en vez de trabajar con el string, trabajé sobre los datos binarios, convirtiendolos en una lista y buscando el primer elemento de la lista con valor 0


temp1 = list(a1[0]) #Generamos una lista para poder buscar el caracter 0
temp1.append(0) #Agregamos siempre un valor 0, para evitar trabajar con la excepcion si no lo encuentra.
temp = temp[0:temp1.index(0)] #Recortamos los caracteres nulos
Título: Re: replace null en python 3.2
Publicado por: fjfnaranjo en 30 de Junio de 2011, 10:29:08 PM
¿Has probado con comillas dobles?

Si no siempre puedes usar un expresión regular: http://stackoverflow.com/questions/1450897/python-removing-characters-except-digits-from-string
Título: Re: replace null en python 3.2
Publicado por: Hechelion en 30 de Junio de 2011, 11:18:21 PM
Dobles, simples, doble barra, con cuatro dígitos, etc, etc, etc. y nada.

Expresiones regulares también probé y lo mismo, bajo 2.6 me funciona todo, pero en 3.2 no hay caso
Por ejemplo
temp = re.sub("\0","",temp)
temp = re.sub("\W","",temp)
en 2.6 me funcionan de maravilla y me devuelven la cadena sin caracteres nulos, pero en 3.2 me sigue devolviendo el carácter nulo, es como si ese carácter fuera invisible en 3.2 (no lo puedo encuentro con find, count, etc) y al imprimir, si me muestra que es un carácter de valor 0.

La única forma que logré hacer funcionar en 3.2, fue interceptar el valor dentro de la lista de bytes, porque ahí busco un elemento de valor 0, pero una vez que lo convierto a string ya no hay caso, es como si ignorara ese carácter, pero me lo imprime en el resultado.
Título: Re: replace null en python 3.2
Publicado por: fjfnaranjo en 30 de Junio de 2011, 11:45:33 PM
Pues vaya, suena difícil la cosa.

Hombre, siendo Python, siempre hay una razón para todo, pero vete tu a saber quien la sabe.

Supongo que habrás probado también diferentes encodings y tal, así que lo único que se me ocurre es que recorras la cadena entera y vayas copiándola a una nuevo ignorando los caracteres que no quieras.

Si puedes crear un código que reproduzca el error súbelo al tracker de bugs, que seguro que alguien de allí te puede echar una mano.
Título: Re: replace null en python 3.2
Publicado por: Hechelion en 02 de Julio de 2011, 01:15:25 AM
Probé cambiar la codificación del string, incluso me parece lógico que ese sea el problema, pero hasta donde sé, tanto es ascii (defecto de 2.6) y utf-8 (defecto de 3.2) el carácter nulo es el mismo. Igual por las dudas voy a probar con xC080 que es el carácter nulo del utf-8 modificado, en usa de esas ahí está el problema.