Python3で「バイナリ文字列」を通常の文字列に変換する方法


257

たとえば、次のような文字列があります(戻り値subprocess.check_output):

>>> b'a string'
b'a string'

私がそれに何をしたにせよ、それは常にb'文字列の前に迷惑を付けて印刷されます:

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

それを通常の文字列として使用する方法、または通常の文字列に変換する方法について誰かが何か考えを持っていますか?



@HanfeiSunが「バイナリ文字列」と呼ぶものは、バイトオブジェクトです標準ライブラリのバイトオブジェクトに関する情報を参照)
loved.by.Jesus

回答:


357

デコードしてください。

>>> b'a string'.decode('ascii')
'a string'

文字列からバイトを取得するには、それをエンコードします。

>>> 'a string'.encode('ascii')
b'a string'

27
@lyomi、ascii与えられた文字列がアスキー文字で作られているので使用しました。エンコーディングがutf-8(Python 3.x str.encodeではbytes.decodedoc-string に従ってデフォルト)の場合、エンコーディングを指定する必要はありません
falsetru

2
@lyomi 2016年(およびその終わり近く)、人々はまだASCIIを使用しています。多くの「レガシー」製品およびシステム(仕様を含む)がありますが、Unicodeまたは何かを試して、複数のバイトを「マージ」したくない「バイナリ文字列」を作成する理由もたくさんあります。単一の文字。私たちはしばしば、インスタンスを作るDNS要求などのバイナリデータを格納する「文字列」を使う
Jmons

答えを完成させるために、以下を追加することをお勧めします。私たちは、デコードに必要なほとんどの時間は、私はそれを行うに見られる最も神託の方法はであり、そのようなコンソール出力として、当社のオペレーティング・システムからバイトをimport localeしてからos_encoding = locale.getpreferredencoding()。この方法で、次のmy_b_string.decode(os_encoding)
コード

2
@aturegano、それが唯一のオプションではありません。sys.getfilesystemencoding()sys.stdin.encodingsys.stdout.encoding。私見、それらの自動エンコーディング検出を使用すると、サブプログラム(OPがサブプロセスを使用している)がエンコーディングを決定する別の方法(またはハードコード)で記述できるため、問題を解決できる可能性があります。とにかく、フィードバックをありがとう。
falsetru 2017

@falsetru sys.getfilesystemencoding()は、Unicodeファイル名とバイトファイル名の間の変換に使用されるエンコーディングの名前を返し、使用しているオペレーティングシステムに強く依存していることに注意してください。私の知る限り、この関数はシステムの優先表現に変換するために使用されます。これは、前述のlocale.getpreferredencoding()関数を使用して取得できるコンソールで使用されるコード化を推測しないことを意味します
aturegano


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.