remove from bytes python string unicode binary

python - from - ¿Qué hace el carácter ''b'' delante de un literal de cadena?



python encode ascii (7)

Además de lo que otros han dicho, tenga en cuenta que un solo carácter en Unicode puede constar de varios bytes .

La forma en que funciona Unicode es que tomó el antiguo formato ASCII (código de 7 bits que parece 0xxx xxxx) y secuencias agregadas de múltiples bytes donde todos los bytes comienzan con 1 (1xxx xxxx) para representar caracteres más allá de ASCII para que Unicode esté al backwards-compatible con ASCII.

>>> len(''Öl'') # German word for ''oil'' with 2 characters 2 >>> ''Öl''.encode(''UTF-8'') # convert str to bytes b''/xc3/x96l'' >>> len(''Öl''.encode(''UTF-8'')) # 3 bytes encode 2 characters ! 3

Al parecer, la siguiente sintaxis es válida.

my_string = b''The string''

Me gustaría saber:

  1. ¿Qué significa este carácter b delante de la cadena?
  2. ¿Cuáles son los efectos de usarlo?
  3. ¿Cuáles son las situaciones apropiadas para usarlo?

Encontré una pregunta relacionada aquí en SO, pero esa pregunta es sobre PHP, y dice que la b se usa para indicar que la cadena es binaria, a diferencia de Unicode, que era necesaria para que el código sea compatible desde la versión de PHP < 6, cuando se migra a PHP 6. No creo que esto se aplique a Python.

Encontré esta documentación en el sitio de Python sobre el uso de un carácter u en la misma sintaxis para especificar una cadena como Unicode. Desafortunadamente, no menciona el carácter b en ninguna parte de ese documento.

Además, solo por curiosidad, ¿hay más símbolos que b y u que hacen otras cosas?


Aquí hay un ejemplo donde la ausencia de ''b'' arrojaría una excepción TypeError en Python 3.x

>>> f=open("new", "wb") >>> f.write("Hello Python!") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: ''str'' does not support the buffer interface

Agregar un prefijo ''b'' solucionaría el problema.


Desde el lado del servidor, si enviamos alguna respuesta, se enviará en forma de tipo de byte. Por lo tanto, aparecerá en el cliente como b''Response desde el servidor ''

Para deshacerse de b ''...'' simplemente use el archivo del servidor de código siguiente

stri="Response from server" c.send(stri.encode())

archivo cliente

print(s.recv(1024).decode())

entonces se imprimirá

Respuesta del servidor


La b denota una cadena de bytes.

Los bytes son los datos reales. Las cuerdas son una abstracción.

Si tenía un objeto de cadena de múltiples caracteres y tomaba un solo carácter, sería una cadena y podría tener más de 1 byte de tamaño dependiendo de la codificación.

Si tomara 1 byte con una cadena de bytes, obtendría un solo valor de 8 bits de 0-255 y podría no representar un carácter completo si los caracteres debidos a la codificación fueran> 1 byte.

TBH Yo usaría cadenas a menos que tuviera alguna razón específica de bajo nivel para usar bytes.


Lo convierte en un literal de bytes (o str en 2.x), y es válido para 2.6+.

El prefijo r hace que las barras invertidas no se interpreten (no se ignoren y la diferencia importa).


Para citar la documentación de Python 2.x :

Un prefijo de ''b'' o ''B'' se ignora en Python 2; indica que el literal debe convertirse en un literal de bytes en Python 3 (por ejemplo, cuando el código se convierte automáticamente con 2to3). Un prefijo ''u'' o ''b'' puede ir seguido de un prefijo ''r''.

La documentación de Python 3 establece:

Los bytes literales siempre tienen el prefijo ''b'' o ''B''; producen una instancia del tipo de bytes en lugar del tipo str. Solo pueden contener caracteres ASCII; Los bytes con un valor numérico de 128 o mayor deben expresarse con escapes.


Python 3.x hace una clara distinción entre los tipos:

  • str = ''...'' literales = una secuencia de caracteres Unicode (UTF-16 o UTF-32, dependiendo de cómo se compiló Python)
  • bytes = b''...'' literales = una secuencia de octetos (enteros entre 0 y 255)

Si está familiarizado con Java o C #, piense en str como String y los bytes como byte[] . Si está familiarizado con SQL, piense en str como NVARCHAR y en bytes como BINARY o BLOB . Si está familiarizado con el registro de Windows, piense en str como REG_SZ y en los bytes como REG_BINARY . Si estás familiarizado con C (++), entonces olvida todo lo que has aprendido sobre char y cadenas, porque UN PERSONAJE NO ES UN BYTE . Esa idea es obsoleta desde hace mucho tiempo.

str cuando quieres representar texto.

print(''שלום עולם'')

Usas bytes cuando quieres representar datos binarios de bajo nivel como estructuras.

NaN = struct.unpack(''>d'', b''/xff/xf8/x00/x00/x00/x00/x00/x00'')[0]

Puede encode una str a un objeto de bytes .

>>> ''/uFEFF''.encode(''UTF-8'') b''/xef/xbb/xbf''

Y puedes decodificar un bytes en un str .

>>> b''/xE2/x82/xAC''.decode(''UTF-8'') ''€''

Pero no puedes mezclar libremente los dos tipos.

>>> b''/xEF/xBB/xBF'' + ''Text with a UTF-8 BOM'' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can''t concat bytes to str

La notación b''...'' es algo confusa ya que permite que los bytes 0x01-0x7F se especifiquen con caracteres ASCII en lugar de números hexadecimales.

>>> b''A'' == b''/x41'' True

Pero debo enfatizar, un personaje no es un byte .

>>> ''A'' == b''A'' False

En Python 2.x

Las versiones pre-3.0 de Python carecían de este tipo de distinción entre texto y datos binarios. En cambio, había:

  • unicode = u''...'' literales = secuencia de caracteres Unicode = 3.x str
  • str = ''...'' literales = secuencias de bytes / caracteres confundidos
    • Generalmente texto, codificado en alguna codificación no especificada.
    • Pero también se utiliza para representar datos binarios como la salida struct.pack .

Para facilitar la transición de 2.x a 3.x, la sintaxis literal b''...'' se realizó en Python 2.6, para permitir distinguir cadenas binarias (que deberían ser bytes en 3.x) del texto cuerdas (que deben ser str en 3.x). El prefijo b no hace nada en 2.x, pero le dice al script 2to3 no lo convierta en una cadena Unicode en 3.x.

Así que sí, b''...'' literales b''...'' en Python tienen el mismo propósito que lo hacen en PHP.

Además, solo por curiosidad, ¿hay más símbolos que b y u que hacen otras cosas?

El prefijo r crea una cadena sin formato (por ejemplo, r''/t'' es una barra invertida + t lugar de una pestaña), y las comillas triples ''''''...'''''' o """...""" permiten múltiples -Línea de literales en cadena.