Pythonで外部プログラムを使用する際、システムコマンドの出力を処理する必要がよくあります。Python 3では、この出力は通常、bytes
オブジェクトとして取得されます。これを処理および表示するためには、bytes
オブジェクトをstr
に変換する必要があります。この記事では、その方法について説明します。
課題
たとえば、システムコマンドls -l
を実行して、現在のディレクトリ内のファイルをリスト表示し、その出力をPythonで取得するとします。subprocess
モジュールを使用してコマンドを実行し、その出力を取得しました:
from subprocess import Popen, PIPE # コマンドを実行し、出力をbytesオブジェクトとして取得 stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0] print(stdout)
結果は次のようにbytes
オブジェクトとして表示されます:
b'total 0\n-rw-rw-r-- 1 user user 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 user user 0 Mar 3 07:03 file2\n'
このbytes
オブジェクトをstr
に変換して、次のように表示したいとします:
total 0 -rw-rw-r-- 1 user user 0 Mar 3 07:03 file1 -rw-rw-r-- 1 user user 0 Mar 3 07:03 file2
解決方法
bytes
をstr
に変換するためには、decode
メソッドを使用し、エンコーディングをUTF-8
に指定します。以下の方法で実行できます:
from subprocess import Popen, PIPE # コマンドを実行し、出力をbytesオブジェクトとして取得 stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0] # bytesオブジェクトをUTF-8エンコーディングでstrに変換 stdout_str = stdout.decode('utf-8') # 文字列を表示 print(stdout_str)
説明
- 出力の取得:
Popen
関数を使用してls -l
コマンドを実行し、標準出力(stdout
)をbytes
オブジェクトとして取得します。 - 変換:
decode('utf-8')
メソッドを使用して、bytes
オブジェクトをstr
に変換します。UTF-8は最も一般的に使用されるエンコーディングです。 - 表示: 結果の文字列を画面に表示します。
上記のコードを実行すると、シェルで直接ls -l
コマンドを実行したときと同様の結果が得られます:
total 0 -rw-rw-r-- 1 user user 0 Mar 3 07:03 file1 -rw-rw-r-- 1 user user 0 Mar 3 07:03 file2
Python 3でbytes
をstr
に変換することは、外部プログラムの出力を処理する際に重要なステップです。decode
メソッドとUTF-8エンコーディングを使用することで、この出力を通常の文字列として簡単に変換および処理できます。この方法が、あなたのプロジェクトで効果的に応用できることを願っています。