Подтвердить что ты не робот

Подавить/печатать без префикса b для байтов в Python 3

Просто опубликуйте это, чтобы я мог найти его позже, так как он всегда меня пеньет:

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

Как вопрос: как печатать двоичную (bytes) строку в Python 3 без префикса b'?

4b9b3361

Ответ 1

Используйте decode:

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

Ответ 2

Если байты уже используют соответствующую кодировку символов; вы можете распечатать их напрямую:

sys.stdout.buffer.write(data)

или

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

Ответ 3

Если данные в формате, совместимом с UTF-8, вы можете преобразовать байты в строку.

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

При желании сначала преобразуйте в шестнадцатеричный формат, если данные еще не совместимы с UTF-8. Например, когда данные являются фактическими необработанными байтами.

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

Ответ 4

Если мы посмотрим на источник для bytes.__repr__, то это будет выглядеть так, как будто b'' запечен в методе.

Наиболее очевидный обходной путь - вручную отрезать b'' от полученного repr():

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

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

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