Sopprimi / stampa senza il prefisso b 'per i byte in Python 3


112

Sto solo postando questo in modo che possa cercarlo in seguito, poiché sembra sempre che mi lasci perplesso:

$ 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'"

Come domanda: come stampare una bytesstringa binary ( ) in Python 3, senza il b'prefisso?


Risposte:


111

Usa decode:

print(curses.version.decode())
# 2.2

1
@jamylak ci ricorda che può accettare parametri
Jemshit Iskenderov

1
Come farlo per impostazione predefinita, voglio dire, è male da usare utf-8per impostazione predefinita? Non voglio usare .decode('utf-8')ogni volta che stampo qualcosa.
Shubham A.

Crea stampa personalizzata
SmartManoj

Assicurati di controllare che curses.versionnon sia Nessuno
cowlinator

24

Se i byte utilizzano già una codifica dei caratteri appropriata; puoi stamparli direttamente:

sys.stdout.buffer.write(data)

o

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

12

Se diamo uno sguardo alla fonte bytes.__repr__, sembra che b''sia incorporata nel metodo.

La soluzione più ovvia è tagliare manualmente b''il risultato repr():

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

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

>>> print(repr(x)[2:-1])
\x01\x02\x03\x04

6
Nota a margine: non credo che nessuna delle altre risposte risponda veramente alla domanda.
Mateen Ulhaq

Penso di essere d'accordo: la tua soluzione, cioè repr(x)[2:-1], produce un stroggetto che verrà stampato come desideri. In particolare repr(b'\x01')[2:-1]restituisce la stringa \\x01, mentre decode()restituisce \x01che non funziona come si vorrebbe con print(). Per essere ancora più espliciti, print(repr(b'\x01')[2:-1])stamperà \x01mentre print(b'\x01'.decode())non stamperà nulla.
Antoine

In alternativa, print(repr(b"\x01".decode()))stamperà '\x01'(una stringa che include le virgolette singole), in modo che venga print(repr(b"\x01".decode())[1:-1])stampato \x01(una stringa senza le virgolette singole).
Antoine

11

Se i dati sono in un formato compatibile UTF-8, puoi convertire i byte in una stringa.

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

Facoltativamente converti prima in esadecimale, se i dati non sono già compatibili con UTF-8. Ad esempio, quando i dati sono byte grezzi effettivi.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.