Tengo un archivo que se mezcla binaria de datos y datos de texto. Quiero analizar a través de una expresión regular, pero me sale este error:

TypeError: can't use a string pattern on a bytes-like object

Supongo que el mensaje significa que Python no quiere analizar archivos binarios.
Me voy a abrir el archivo con el "rb" banderas.

¿Cómo puedo analizar archivos binarios con expresiones regulares en Python?

EDICIÓN: estoy usando Python 3.2.0

Supongo que la referencia a bytes-como objeto que usted está usando Python 3, ¿es correcto?

OriginalEl autor DonkeyMaster | 2011-04-11

3 Comentarios

  1. 21

    Creo que el uso de Python 3 .

    1.La apertura de un archivo en modo binario es simple pero sutil. La única diferencia
    a partir de la apertura en el modo texto es que
    el modo de parámetro contiene un ‘b’
    carácter.

    ……..

    4.Aquí hay una diferencia, sin embargo: una secuencia binaria objeto sin ningún tipo de codificación
    atributo. Eso tiene sentido, ¿verdad?
    Que usted está leyendo (o escribiendo) bytes, no
    las cadenas, así que no hay ninguna conversión para
    Python para hacer.

    http://www.diveintopython3.net/files.html#read

    Luego, en Python 3, ya que una secuencia binaria de un archivo es una secuencia de bytes, un regex para analizar una secuencia de un archivo debe ser definido de acuerdo con una secuencia de bytes, no es una secuencia de caracteres.

    En Python 2, fue una cadena en una matriz de
    bytes cuya codificación de caracteres se
    seguimiento por separado. Si usted quería
    Python 2 de seguir la pista de la
    la codificación de caracteres, tenía que usar un
    Cadena de Unicode (u») en su lugar. Pero en
    En Python 3, una cadena es siempre lo que
    Python 2 se llama una cadena Unicode —
    es decir, una matriz de Unicode
    personajes (posiblemente de diferentes byte
    las longitudes).

    http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html

    y

    En Python 3, todas las cadenas son secuencias
    de caracteres Unicode. No hay
    tal cosa como una cadena Python codificado
    en UTF-8, o una cadena Python codificado
    como CP-1252. «Es esta cadena UTF-8?»
    una pregunta no válido. UTF-8 es una manera de
    la codificación de caracteres como una secuencia de
    bytes. Si usted quiere tomar una cadena
    y convertirlo en una secuencia de bytes
    en una codificación de caracteres en particular,
    Python 3 puede ayudar con eso.

    http://www.diveintopython3.net/strings.html#boring-stuff

    y

    4.6. Cadenas vs Bytes# Bytes bytes; los caracteres son una abstracción.
    Una inmutable de la secuencia de Unicode
    los personajes se llama una cadena. Un
    inmutable de la secuencia de
    los números entre 0 y 255 se llama
    bytes objeto.

    ….

    1.Para definir una bytes objeto, el uso de la b’ ‘ «byte literal» sintaxis. Cada byte
    dentro del byte literal puede ser un
    Carácter ASCII o codificado
    número hexadecimal de \x00 \xff
    (0-255).

    http://www.diveintopython3.net/strings.html#boring-stuff

    Así que usted tendrá que definir su expresión regular como sigue

    pat = re.compile(b'[a-f]+\d+')

    y no como

    pat = re.compile('[a-f]+\d+')

    Más explicaciones aquí:

    15.6.4. No se puede utilizar un patrón de cadena en bytes-como objeto

    Upvoted porque explica el porque, para referencia en el futuro. Yo kniw lo que una codificación es, y su mensaje era demasiado detallado, en mi humilde opinión, aunque al final le dará la respuesta que necesitaba.
    Tomar una pista !-)
    Machin ¿Qué quieres decir, por favor ?

    OriginalEl autor eyquem

  2. 26

    En su re.compile necesita usar un bytes objeto, representado por una inicial b:

    r = re.compile(b"(This)")

    Este es Python 3 siendo quisquilloso acerca de la diferencia entre las cuerdas y la bytes.

    Esta respuesta me puso en el camino correcto, muchas gracias.

    OriginalEl autor Scott Griffiths

  3. -3

    Este es trabajo para mí para python 2.6

    >>> import re
    >>> r = re.compile(".*(ELF).*")
    >>> f = open("/bin/ls")
    >>> x = f.readline()
    >>> r.match(x).groups()
    ('ELF',)
    Este código import re; r = re.compile("(This)"); f = open(r"C:\WINDOWS\system32\mspaint.exe", "rb"); x = f.readline(); r.match(x).groups() devuelve el mismo error como mi post original

    OriginalEl autor Rumple Stiltskin

Dejar respuesta

Please enter your comment!
Please enter your name here