Pomiń / drukuj bez prefiksu b 'dla bajtów w Pythonie 3

112

Po prostu publikuję to, abym mógł go później wyszukać, ponieważ zawsze wydaje mi się, że mnie to przytłacza:

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

Jako pytanie: jak wydrukować ciąg binary ( bytes) w Pythonie 3, bez b'prefiksu?

sdaau
źródło

Odpowiedzi:

111

Zastosowanie decode:

print(curses.version.decode())
# 2.2
sdaau
źródło
1
@jamylak to przypomnienie, że może akceptować parametr
Jemshit Iskenderov
1
Jak to zrobić domyślnie, mam na myśli, czy domyślnie jest to złe utf-8? Nie chcę używać tego .decode('utf-8')za każdym razem, gdy coś drukuję.
Shubham A.
Utwórz niestandardowy wydruk
SmartManoj
Pamiętaj, aby sprawdzić, curses.versionczy nie jest to None
cowlinator
24

Jeśli bajty używają już odpowiedniego kodowania znaków; możesz je wydrukować bezpośrednio:

sys.stdout.buffer.write(data)

lub

nwritten = os.write(sys.stdout.fileno(), data)  # NOTE: it may write less than len(data) bytes
jfs
źródło
12

Jeśli spojrzymy na źródło bytes.__repr__, wygląda na to, że b''jest upieczony w metodzie.

Najbardziej oczywistym obejściem jest ręczne odcięcie b''od wyniku 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
źródło
6
Uwaga dodatkowa: nie sądzę, aby żadna z pozostałych odpowiedzi naprawdę odpowiadała na to pytanie.
Mateen Ulhaq
Myślę, że się zgodzę: twoje rozwiązanie, a mianowicie repr(x)[2:-1], tworzy strobiekt, który będzie drukowany zgodnie z życzeniem. W szczególności repr(b'\x01')[2:-1]zwraca łańcuch \\x01, podczas gdy decode()zwróci, \x01który nie działa tak, jak byśmy chcieli print(). Mówiąc jeszcze dokładniej, print(repr(b'\x01')[2:-1])wydrukuje, \x01podczas gdy print(b'\x01'.decode())nic nie wydrukuje.
Antoine
Alternatywnie, print(repr(b"\x01".decode()))wypisze '\x01'(ciąg zawierający pojedyncze cudzysłowy), tak że print(repr(b"\x01".decode())[1:-1])wypisze \x01(ciąg bez apostrofów).
Antoine
11

Jeśli dane są w formacie zgodnym z UTF-8, możesz przekonwertować bajty na ciąg.

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

Opcjonalnie najpierw przekonwertuj na format szesnastkowy, jeśli dane nie są jeszcze zgodne z UTF-8. Np. Kiedy dane są rzeczywistymi surowymi bajtami.

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
Szczery
źródło