Python 3'te baytlar için b 'öneki olmadan bastır / yazdır


112

Her zaman beni şaşırttığı için daha sonra arayabilmek için bunu gönderiyorum:

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

Soru olarak: bytesPython 3'te b'önek olmadan bir ikili ( ) dizesi nasıl yazdırılır ?


Yanıtlar:


111

Kullanım decode:

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

1
@jamylak, parametre kabul edebileceğini hatırlatıyor
Jemshit Iskenderov

1
Varsayılan olarak bu nasıl yapılır, yani utf-8varsayılan olarak kullanmak kötü mü? Her bir .decode('utf-8')şey yazdırdığımda kullanmak istemiyorum .
Shubham A.

Özel baskı oluştur
SmartManoj

curses.versionHiçbiri olmadığını kontrol ettiğinizden emin olun
başlık

24

Baytlar zaten uygun bir karakter kodlaması kullanıyorsa; bunları doğrudan yazdırabilirsiniz:

sys.stdout.buffer.write(data)

veya

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

12

Kaynağına bakarsak, bytes.__repr__sankib'' , yöntemde pişirilmiş .

En belirgin geçici çözüm kapalı elle dilim etmektir b''çıkan den 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
Yan not: Diğer yanıtların hiçbirinin soruyu gerçekten yanıtladığını düşünmüyorum .
Mateen Ulhaq

Sanırım aynı fikirdeyim: Çözümünüz, yani arzu ettiğiniz gibi basılacak repr(x)[2:-1]bir strnesne üretiyor . Özellikle, repr(b'\x01')[2:-1]dizgeyi döndürür \\x01, while decode()döndürür \x01ki bu, istenildiği gibi çalışmaz print(). Hatta daha açık, olmak print(repr(b'\x01')[2:-1])yazdırır \x01iken print(b'\x01'.decode())şey yazdırmaz.
Antoine

Alternatif olarak, print(repr(b"\x01".decode()))yazdırır '\x01'(tek tırnakları içeren bir dize), böylece print(repr(b"\x01".decode())[1:-1])yazdırılır \x01(tek tırnaksız bir dize).
Antoine

11

Veriler UTF-8 uyumlu bir formattaysa, baytları bir dizeye dönüştürebilirsiniz.

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

Veriler zaten UTF-8 uyumlu değilse, isteğe bağlı olarak önce hex'e dönüştürün. Örneğin, veriler gerçek ham baytlar olduğunda.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.