投稿するだけで後で検索できるようになります。
$ 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'"
質問として:Python 3にb'
プレフィックスなしでバイナリ(bytes
)文字列を印刷する方法は?
decode
を使用します。
print(curses.version.decode())
# 2.2
バイトがすでに適切な文字エンコーディングを使用している場合;それらを直接印刷できます:
sys.stdout.buffer.write(data)
または
nwritten = os.write(sys.stdout.fileno(), data) # NOTE: it may write less than len(data) bytes
データがUTF-8互換形式の場合、バイトを文字列に変換できます。
>>> import curses
>>> print(str(curses.version, "utf-8"))
2.2
データがまだUTF-8互換でない場合は、オプションで最初に16進数に変換します。例えば。データが実際の生バイトである場合。
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
bytes.__repr__
のソースを見ると、b''
がメソッドにベイクされているように見えます。
最も明らかな回避策は、結果のrepr()
からb''
を手動でスライスすることです。
>>> x = b'\x01\x02\x03\x04'
>>> print(x)
b'\x01\x02\x03\x04'
>>> print(repr(x)[2:-1])
\x01\x02\x03\x04