Придушення / друк без префіксу 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) рядок у Python 3, без b'префікса?


Відповіді:


111

Використання decode:

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

1
@jamylak нагадує, що він може приймати параметр
Jemshit Iskenderov

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

Створіть спеціальний друк
SmartManoj

Обов’язково переконайтеся, що curses.versionце не None
каулінатор

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.