¿Cómo hacer una comparación binaria segura en Python?

Tengo el siguiente fragmento de código que lanza una advertencia:

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

try:
    f = open_old(filename, "rb")
    aBuf = f.read(4)
    f.close()
except:
    aBuf=b''
if aBuf[:3] == b'\xEF\xBB\xBF':
    print("...")

¿Cuál es la forma correcta de leer 3 bytes del archivo y verificar sus valores?

Estoy buscando una solución que funcione correctamente en Python 2.6 y newwer (incluido 3.x).

preguntado el 10 de mayo de 11 a las 13:05

Lo siento si esta es una observación tonta, pero ¿no le gustaría decir f.read(3) leer 3 bytes? -

No del todo :) ... esto es solo un extracto de un fragmento de código más grande. De todos modos, ya encontré una solución que funciona tanto en Python 2.xy 3.x. Compruébalo en github.com/ssbarnea/tendo/blob/master/tendo/unicode.py#L23 -

Luego, debe agregar la respuesta a este hilo y aceptarla. -

La advertencia solo se lanza al comparar Python 2 unicode objetos con un str objeto bytestring. Tú tienes no hay tal comparación en el código de muestra aquí. Su problema no puede provenir del código que publicó. -

Y lo que es open_old aquí de todos modos? Esa no es una función de Python incorporada. Si eso produce un objeto de archivo que devuelve unicode en Python 2 pero bytes en Python 3, huya de él. No camines corrida. Está muy roto. -

1 Respuestas

La solución es convertir la cadena en bytes después de leerla: aBuf = bytes(f.read(4)).

contestado el 10 de mayo de 11 a las 19:05

Abrí un nuevo hilo sobre conversión binaria en Python aquí stackoverflow.com/q/31322641/54964 ¿Su sistema es Linux o Windows? ¿Su archivo es binario? - Léo Léopold Hertz 준영

Abriste el archivo en modo binario; eso significa que en Python 3 tu ya haya utilizado obtener bytes(). En Python 2 bytes es un alias para str y ya haya utilizado obtener str objetos de file.read() llamada. Utilizando bytes() en un objeto de archivo abierto en modo binario no hace ninguna diferencia. - Martijn Pieters ♦

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.