Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





replace null en python 3.2

Iniciado por Hechelion, 29 de Junio de 2011, 11:52:01 AM

« anterior - próximo »

Hechelion

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.

Hechelion

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

fjfnaranjo

fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

Hechelion

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.

fjfnaranjo

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.
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

Hechelion

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.