Python 3でバイトのプレフィックスb 'なしで抑制/印刷


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

質問:bytesPython 3でバイナリ()文字列をb'接頭辞なしで印刷する方法は?


回答:


111

使用decode

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

1
@jamylakそれはパラメータを受け入れることができることを思い出させる
Jemshit Iskenderov '27

1
デフォルトでこれを行う方法、つまり、デフォルトで使用utf-8するのは悪いですか?.decode('utf-8')何かを印刷するたびに使いたくありません。
Shubham A.

カスタムプリントの作成
SmartManoj

curses.versionNoneでないことを確認してください
カウリネーター

24

バイトがすでに適切な文字エンコーディングを使用している場合; あなたはそれらを直接印刷することができます:

sys.stdout.buffer.write(data)

または

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

11

データが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

11

のソースを見ると、がメソッドに組み込まれている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

5
サイドノート:他の答えのどれも本当に質問に答えるとは思いません。
Mateen Ulhaq

私は同意するだろうと思います。つまりrepr(x)[2:-1]、あなたの解決策は、str希望どおりに印刷されるオブジェクトを生成します。具体的には、repr(b'\x01')[2:-1]文字列を返し\\x01ながら、decode()戻ります\x011は、と希望と同じように仕事をしませんprint()。さらに明確にprint(repr(b'\x01')[2:-1])するために、は印刷\x01print(b'\x01'.decode())ますが、何も印刷しません。
アントワーヌ

代替的に、print(repr(b"\x01".decode()))印刷される'\x01'ように、(一重引用符を含む文字列)print(repr(b"\x01".decode())[1:-1])印刷\x01(一重引用符無しの文字列)。
アントワーヌ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.