このコードを使用して、外部プログラムから標準出力を取得しています。
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
communication()メソッドはバイトの配列を返します。
>>> 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'
バイト値を文字列に戻すにはどうすればよいですか?つまり、手動で行う代わりに「バッテリー」を使用します。そして、私はそれがPython 3で問題ないようにしたいと思います。
str(text_bytes)
エンコーディングを指定できないため。text_bytesの内容によっては、text_bytes.decode('cp1250
) ` はとは非常に異なる文字列になる可能性がありますtext_bytes.decode('utf-8')
。
str
関数はもう実際の文字列に変換されません。なんらかの理由でエンコーディングを明示的に言う必要があるのですが、その理由を読むのが面倒です。変換してutf-8
、urコードが機能するかどうかを確認してください。例var = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
Python 3で期待どおりに動作します。テキストにデコードするのではなく、テキスト表現を生成するunicode_text = bytestring.decode(character_encoding)
だけstr(bytes_obj)
で混乱を避ける方が望ましいbytes_obj
です。str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
そしてstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
ですか?これは私には奇妙に思えます。