Unterdrücken / Drucken ohne b 'Präfix für Bytes in Python 3

112

Posten Sie dies einfach, damit ich später danach suchen kann, da es mich immer zu überraschen scheint:

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

Als Frage: Wie drucke ich eine binäre ( bytes) Zeichenfolge in Python 3 ohne das b'Präfix?

sdaau
quelle

Antworten:

111

Verwendung decode:

print(curses.version.decode())
# 2.2
sdaau
quelle
1
@ Jamylak es ist Erinnerung, dass es Parameter akzeptieren kann
Jemshit Iskenderov
1
Wie mache ich das utf-8standardmäßig? Ich meine, ist es schlecht, es standardmäßig zu verwenden? Ich möchte das nicht .decode('utf-8')jedes Mal verwenden, wenn ich etwas drucke.
Shubham A.
Erstellen Sie benutzerdefinierten Druck
SmartManoj
curses.version
Stellen
24

Wenn die Bytes bereits eine geeignete Zeichenkodierung verwenden; Sie können sie direkt ausdrucken:

sys.stdout.buffer.write(data)

oder

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

Wenn die Daten in einem UTF-8-kompatiblen Format vorliegen, können Sie die Bytes in eine Zeichenfolge konvertieren.

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

Optional können Sie zuerst in hex konvertieren, wenn die Daten noch nicht UTF-8-kompatibel sind. ZB wenn die Daten tatsächliche Rohbytes sind.

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
Frank
quelle
11

Wenn wir uns die Quelle für ansehen bytes.__repr__, sieht es so aus, als ob die b''in die Methode eingebrannt ist.

Die naheliegendste Problemumgehung besteht darin, b''das Ergebnis manuell zu entfernen 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
quelle
5
Randnotiz: Ich glaube, keine der anderen Antworten beantwortet die Frage wirklich .
Mateen Ulhaq
Ich denke, ich würde zustimmen: Ihre Lösung repr(x)[2:-1]erzeugt nämlich ein strObjekt, das wie gewünscht gedruckt wird. Gibt insbesondere repr(b'\x01')[2:-1]die Zeichenfolge zurück \\x01, während zurückgegeben decode()wird, \x01was nicht wie gewünscht funktioniert print(). Um noch expliziter zu sein, print(repr(b'\x01')[2:-1])wird gedruckt, \x01während print(b'\x01'.decode())nichts gedruckt wird.
Antoine
Alternativ print(repr(b"\x01".decode()))wird gedruckt '\x01'(eine Zeichenfolge einschließlich der einfachen Anführungszeichen), so dass print(repr(b"\x01".decode())[1:-1])gedruckt wird \x01(eine Zeichenfolge ohne die einfachen Anführungszeichen).
Antoine