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?
python
string
python-3.x
sdaau
źródło
źródło
Odpowiedzi:
Zastosowanie
decode
:źródło
utf-8
? Nie chcę używać tego.decode('utf-8')
za każdym razem, gdy coś drukuję.curses.version
czy nie jest to NoneJeśli bajty używają już odpowiedniego kodowania znaków; możesz je wydrukować bezpośrednio:
lub
źródło
Jeśli spojrzymy na źródło
bytes.__repr__
, wygląda na to, żeb''
jest upieczony w metodzie.Najbardziej oczywistym obejściem jest ręczne odcięcie
b''
od wynikurepr()
:źródło
repr(x)[2:-1]
, tworzystr
obiekt, który będzie drukowany zgodnie z życzeniem. W szczególnościrepr(b'\x01')[2:-1]
zwraca łańcuch\\x01
, podczas gdydecode()
zwróci,\x01
który nie działa tak, jak byśmy chcieliprint()
. Mówiąc jeszcze dokładniej,print(repr(b'\x01')[2:-1])
wydrukuje,\x01
podczas gdyprint(b'\x01'.decode())
nic nie wydrukuje.print(repr(b"\x01".decode()))
wypisze'\x01'
(ciąg zawierający pojedyncze cudzysłowy), tak żeprint(repr(b"\x01".decode())[1:-1])
wypisze\x01
(ciąg bez apostrofów).Jeśli dane są w formacie zgodnym z UTF-8, możesz przekonwertować bajty na ciąg.
Opcjonalnie najpierw przekonwertuj na format szesnastkowy, jeśli dane nie są jeszcze zgodne z UTF-8. Np. Kiedy dane są rzeczywistymi surowymi bajtami.
źródło