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


112

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

$ 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строку binary ( ) в Python 3 без b'префикса?


Ответы:


111

Использование decode:

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

1
@jamylak напоминание, что он может принимать параметр
Джемшит Искендеров

1
Как это сделать по умолчанию, я имею ввиду, плохо ли использовать utf-8по умолчанию? Я не хочу использовать его .decode('utf-8')каждый раз, когда что-то печатаю.
Шубхам А.

Создание индивидуальной печати
SmartManoj

Обязательно проверьте, что curses.versionэто не None
cowlinator

24

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

sys.stdout.buffer.write(data)

или

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

12

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

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

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

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

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

6
Боковое примечание: я не думаю, что какие-либо другие ответы действительно отвечают на вопрос.
Mateen Ulhaq

Думаю, я согласен: ваше решение, а именно repr(x)[2:-1], создает strобъект, который будет печатать по желанию. В частности, repr(b'\x01')[2:-1]возвращает строку \\x01, а decode()вернет, \x01что работает не так, как хотелось бы print(). Чтобы быть еще более явным, print(repr(b'\x01')[2:-1])будет печатать, \x01а print(b'\x01'.decode())ничего не печатать.
Антуан

В качестве альтернативы print(repr(b"\x01".decode()))будет печататься '\x01'(строка, включая одинарные кавычки), так что print(repr(b"\x01".decode())[1:-1])печатает \x01(строка без одинарных кавычек).
Антуан

11

Если данные находятся в формате, совместимом с 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.