Pythonのprint()関数でファイルに書き込む

Python の print() 関数は通常、Python プログラムの実行方法に応じて、コマンドラインまたは対話型インタープリタのどちらかにテキストを表示するために使用されます。しかし、コンソールにではなくファイルにテキストを書き込むようにその動作を変更することができます。

この記事では、 print() 関数を使ってファイルに書き込むための様々な方法を調べます。

Pythonのスクリプト出力をターミナルでリダイレクトする

Python スクリプトの出力をリダイレクトする手っ取り早い方法は、スクリプトを実行中にコマンドラインから直接行うことです。

例えば、次のような内容の hello.py という Python ファイルがあったとします。

print("Hallo") # Deliberately in German


このファイルの出力をシェルでリダイレクトするには、右山括弧を1つ使用します。

$ python3 hello.py > output.txt


新しく作成した output.txt を開くと、次のような内容が表示されます。

Hallo


しかし、この方法では、スクリプトのすべての出力がファイルに書き込まれます。このリダイレクトは、Pythonスクリプトの内部から行う方が柔軟性がある場合が多いです。

標準出力ストリームのリダイレクト

Python では、 print() 関数は思ったより柔軟です。この関数は、指定されたテキストがディスプレイにのみ書き込まれるようにハードコーディングされているわけではありません。その代わりに、 stdout としても知られている標準出力ストリームと呼ばれる場所にテキストを送ります。

すべての UNIX システムには、標準入力パイプ (stdin)、標準出力パイプ (stdout)、標準エラーパイプ (stderr) の 3 つの主要なパイプがあります。

デフォルトでは、標準出力パイプはプログラムの実行に使用した対話型ウィンドウを指しているので、通常は画面にテキストが出力されるのを見ることができます。しかし、標準出力は便宜上、ファイルなど他の場所にリダイレクトすることができます。

標準出力を特定のファイルにリダイレクトすると、 print() 関数で指定したテキストが画面に表示されずにそのファイルに書き込まれます。

Python では、標準出力への参照は sys モジュールの stdout オブジェクトを使用して得ることができます。これはファイルライクなオブジェクトで、Pythonが実際のファイルのように読み書きできるメソッドを持っています。

ここでは、stdout をファイルに変更する例を見てみましょう。

import sys


print('This message will be displayed on the screen.')


original_stdout = sys.stdout # Save a reference to the original standard output


with open('filename.txt', 'w') as f:
    sys.stdout = f # Change the standard output to the file we created.
    print('This message will be written to a file.')
    sys.stdout = original_stdout # Reset the standard output to its original value


print()関数は与えられた文字列の引数を受け取り、最後に改行文字を追加して、stdout.write()` メソッドを呼び出して標準出力に書き込みます。

上の例では、まずいつものように1行のテキストを出力し、ファイルを実行したときにコンソールに表示されるようにしています。それから、stdout をカスタムファイルオブジェクト f に再割り当てしました。ファイルオブジェクトは完全に有効な write() メソッドを持っているので、印刷された値は問題なくファイルに書き込まれます。

標準出力を変更する前に、標準出力の元の値を変数に保存しておくことは良い習慣であることに注意してください。こうすることで、作業が終わった後に標準出力を元の値に戻すことができ、混乱を避けることができます。

このコードを新しいファイル、 printToFile.py に保存しましょう。そして、それを実行してみましょう。

$ python3 printToFile.py


ターミナルに次のような出力が表示されます。

This message will be displayed on the screen.


そして、スクリプトは次のような内容の filename.txt という新しいファイルを作成します。

This message will be written to a file.


標準出力ストリームからファイルにデータをリダイレクトすることに成功しました。この方法を、プログラミングエラーに特化した、よく使われるファイルのようなオブジェクトに適用して見ましょう。

標準エラーストリームのリダイレクト

Python では、エラーは stderr として知られている標準エラーストリームに書き込まれます。このストリームもデフォルトではインタラクティブウィンドウに書き込まれますが、 sys.stderr オブジェクトで変更することができます。もし、 stderr に値を出力したい場合は、 sys.stdout をリダイレクトして sys.stderr を指すようにすればよいでしょう。

printToStderr.py` というファイルを作成し、以下のコードを追加します。

import sys


print('This message will be displayed via standard output.')


original_stdout = sys.stdout # Save a reference to the original standard output


sys.stdout = sys.stderr # Redirect the standard output to the standard error.
print('This message will be displayed via the standard error.')


sys.stdout = original_stdout # Reset the standard output to its original value


この例は、標準出力ストリームをファイルにリダイレクトする代わりに、標準エラーストリームにリダイレクトする以外は、前の例とほとんど同じです。もし標準エラーストリームもどこかにリダイレクトされていれば、出力は画面ではなくその場所に送られるでしょう。

このファイルを実行してみましょう。

$ python3 printToStderr.py


出力は次のようになります。

This message will be displayed via standard output.
This message will be displayed via the standard error.


私たちには通常の出力のように見えるかもしれませんが、コンピュータにとっては異なるパイプラインを通じて表示されます。

“file” パラメータを使った印刷

これまでの例では、 stdout オブジェクトを変更することで、標準出力を他のファイルのようなオブジェクトに明示的にリダイレクトしていました。しかし、便利なことに print() 関数の中で、 file パラメータで出力先を指定することにより、直接これを行うことができます。

例えば、スクリプト全体の stdout を変更せずに直接ファイルに出力したい場合は、次のように記述します。

import sys


print('This message will be displayed on the screen.')


with open('filename.txt', 'w') as f:
    print('This message will be written to a file.', file=f)


標準出力のリダイレクトを明示的に行わなかったので、標準出力を初期値に戻す必要はありません。結果として、これは print() 関数でファイルに書き込むための好ましい方法となります。

注意: パラメータの名前は file ですが、これはどんなファイルライクオブジェクトでも動作することを覚えておいてください。例えば、stderr に出力したい場合は、 print() ステートメントを次のように変更します。

print('This message will be written to stderr.', file=sys.stderr)


結論

この記事では、様々な方法を用いて Python の print() 関数出力をリダイレクトすることについて説明しました。これらの方法には、コマンドラインから Python スクリプトの出力をリダイレクトする、 Python スクリプト内の標準出力をリダイレクトする、 print() 関数の file パラメータでファイルのようなオブジェクトを直接指定する、などがあります。

著者について

この記事は、ソフトウェア開発者であり、コードを通じて人々の生活を向上させることに情熱を注ぐコンサルタントであるJacob Stopakによって書かれました。Jacobは、コーディングに不可欠な概念とツールを網羅した入門書、「Coding Essentials Guidebook for Developers」の著者です。基本的なコンピュータ・アーキテクチャ、インターネット、コマンドライン、HTML、CSS、JavaScript、Python、Java、データベース/SQL、Gitなどに関する章を含んでいます。

タイトルとURLをコピーしました