Sembunyikan / cetak tanpa awalan b 'untuk byte dengan Python 3

112

Hanya memposting ini agar saya dapat mencarinya nanti, karena sepertinya selalu membingungkan saya:

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

Sebagai pertanyaan: bagaimana cara mencetak bytesstring binary ( ) dengan Python 3, tanpa b'awalan?

sdaau
sumber

Jawaban:

111

Penggunaan decode:

print(curses.version.decode())
# 2.2
sdaau
sumber
1
@jamylak itu adalah pengingat bahwa ia dapat menerima parameter
Jemshit Iskenderov
1
Bagaimana melakukan ini secara default, maksud saya, apakah buruk untuk digunakan utf-8secara default? Saya tidak ingin menggunakan .decode('utf-8')setiap kali saya mencetak sesuatu.
Shubham A.
Buat cetakan khusus
SmartManoj
Pastikan untuk memeriksa bahwa curses.versionbukan None
cowlinator
24

Jika byte sudah menggunakan pengkodean karakter yang sesuai; Anda dapat mencetaknya secara langsung:

sys.stdout.buffer.write(data)

atau

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

Jika kita melihat pada sumbernya bytes.__repr__, sepertinya b''sudah dimasukkan ke dalam metode.

Solusi yang paling jelas adalah dengan memotong secara manual b''dari hasil 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
sumber
6
Catatan tambahan: Saya rasa tidak ada jawaban lain yang benar-benar menjawab pertanyaan itu.
Mateen Ulhaq
Saya rasa saya setuju: solusi Anda, yaitu repr(x)[2:-1]menghasilkan sebuah strobjek yang akan dicetak sesuai keinginan. Secara khusus, repr(b'\x01')[2:-1]mengembalikan string \\x01, sementara decode()akan mengembalikan \x01yang tidak berfungsi seperti yang diinginkan print(). Untuk lebih eksplisit lagi, print(repr(b'\x01')[2:-1])akan mencetak \x01sementara print(b'\x01'.decode())tidak akan mencetak apa pun.
Antoine
Alternatifnya, print(repr(b"\x01".decode()))akan mencetak '\x01'(string termasuk tanda kutip tunggal), sehingga print(repr(b"\x01".decode())[1:-1])mencetak \x01(string tanpa tanda kutip tunggal).
Antoine
11

Jika data dalam format yang kompatibel dengan UTF-8, Anda dapat mengonversi byte menjadi string.

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

Secara opsional, ubah ke hex terlebih dahulu, jika datanya belum kompatibel dengan UTF-8. Misalnya, saat data dalam byte mentah sebenarnya.

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
jujur
sumber