1. ホーム
  2. python

[解決済み] バイトを文字列に変換する

2022-03-18 04:22:44

質問

このコードを使って、外部プログラムから標準出力を取得しています。

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

communicate()メソッドは、バイトの配列を返します。

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

しかし、私はこの出力を通常のPythonの文字列として扱いたいと考えています。そうすれば、このように出力することができます。

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

ということかと思いきや binascii.b2a_qp() メソッドがありますが、試したところ、また同じバイト配列が表示されました。

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

バイトの値を文字列に戻すにはどうすればよいですか?つまり、手動で行うのではなく、"battery"を使用することです。あと、Python3でもOKにしたいです。

どのように解決するのですか?

bytesオブジェクトをデコードして文字列を生成する必要があります。

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'

ご覧ください。 https://docs.python.org/3/library/stdtypes.html#bytes.decode