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エンコーディングを使用することで、この出力を通常の文字列として簡単に変換および処理できます。この方法が、あなたのプロジェクトで効果的に応用できることを願っています。
