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?


Antworten:


111

Verwendung decode:

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

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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.