Suprimir / imprimir sin el prefijo b 'para bytes en Python 3

112

Solo publico esto para poder buscarlo más tarde, ya que siempre parece desconcertarme:

$ python3.2
Python 3.2 (r32:88445, Oct 20 2012, 14:09:50) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import curses
>>> print(curses.version)
b'2.2'
>>> print(str(curses.version))
b'2.2'
>>> print(curses.version.encode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'
>>> print(str(curses.version).encode('utf-8'))
b"b'2.2'"

Como pregunta: ¿cómo imprimir una bytescadena binaria ( ) en Python 3, sin el b'prefijo?

sdaau
fuente

Respuestas:

111

Utilizar decode:

print(curses.version.decode())
# 2.2
sdaau
fuente
1
@jamylak es un recordatorio de que puede aceptar el parámetro
Jemshit Iskenderov
1
¿Cómo hacer esto por defecto? Quiero decir, ¿es malo usarlo utf-8por defecto? No quiero usar el .decode('utf-8')cada vez que imprimo algo.
Shubham A.
Crear impresión personalizada
SmartManoj
Asegúrese de verificar que curses.versionno sea Ninguno
cowlinator
24

Si los bytes ya utilizan una codificación de caracteres adecuada; puedes imprimirlos directamente:

sys.stdout.buffer.write(data)

o

nwritten = os.write(sys.stdout.fileno(), data)  # NOTE: it may write less than len(data) bytes
jfs
fuente
12

Si echamos un vistazo a la fuente de bytes.__repr__, parece que b''está integrado en el método.

La solución alternativa más obvia es cortar manualmente b''el resultado del resultado repr():

>>> x = b'\x01\x02\x03\x04'

>>> print(repr(x))
b'\x01\x02\x03\x04'

>>> print(repr(x)[2:-1])
\x01\x02\x03\x04
Mateen Ulhaq
fuente
6
Nota al margen: No creo que ninguna de las otras respuestas realmente responda a la pregunta.
Mateen Ulhaq
Creo que estaría de acuerdo: su solución, a saber repr(x)[2:-1], produce un strobjeto que se imprimirá como desee. En particular, repr(b'\x01')[2:-1]devuelve la cadena \\x01, mientras decode()que devolverá \x01que no funciona como uno desearía print(). Para ser aún más explícito, print(repr(b'\x01')[2:-1])imprimirá \x01mientras print(b'\x01'.decode())que no imprimirá nada.
Antoine
Alternativamente, print(repr(b"\x01".decode()))imprimirá '\x01'(una cadena que incluye las comillas simples), de modo que print(repr(b"\x01".decode())[1:-1])imprima \x01(una cadena sin las comillas simples).
Antoine
11

Si los datos están en un formato compatible con UTF-8, puede convertir los bytes en una cadena.

>>> import curses
>>> print(str(curses.version, "utf-8"))
2.2

Opcionalmente, convierta primero a hexadecimal, si los datos aún no son compatibles con UTF-8. Por ejemplo, cuando los datos son bytes sin procesar reales.

from binascii import hexlify
from codecs import encode  # alternative
>>> print(hexlify(b"\x13\x37"))
b'1337'
>>> print(str(hexlify(b"\x13\x37"), "utf-8"))
1337
>>>> print(str(encode(b"\x13\x37", "hex"), "utf-8"))
1337
Franco
fuente