ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】printの表示内容をファイルに出力する

 今回はタイトルにあるようにprintでの表示内容をファイルに出力する方法の備忘録になります。

 少し特殊ですが「printの内容をファイルにログ的なものとして残しておきたいが、そのprintの内容がライブラリになっている」など簡単に処理を追加しにくい場合に今回の内容が必要になってくるかと思います。


 では、始めます。


1:printの内容をファイルに出力する
 やり方は簡単で以下の記述でできます。

import sys

# 表示内容の出力をファイルに変更
sys.stdout = open("test.log", "w")

# ファイルを閉じて標準出力を元に戻す
sys.stdout.close()
sys.stdout = sys.__stdout__

 sys.stdoutがprintを実行した際の出力先なので、openでファイルを指定します。その後は通常通りにprint関数を使うとコンソールには表示されず、指定したファイルに内容が書き込まれます。
 printの出力をコンソールに戻す場合は一度「sys.stdout.close()」した後に「sys.stdout = sys.__stdout__」することで元に戻すことができます。


2:サンプルコード
 特に難しいところはないと思いますが、実際にサンプルコードを書いて動かしてみます。

・print_log.py

#-*- coding:utf-8 -*-
import sys


def main():
    print("---- start ----")

    log_file_path = "./log.txt"
    sys.stdout = open(log_file_path, "w") # 表示内容の出力をファイルに変更

    loop_print(10) # ファイルに出力される

    # ファイルを閉じて標準出力を元に戻す
    sys.stdout.close()
    sys.stdout = sys.__stdout__

    loop_print(20) # コンソールに表示される

    print("---- end ----")


def loop_print(num):
    for i in range(0, 10):
        print(str(num + i))


if __name__ == '__main__':
    main()


 実行すると以下のように20~29の表示しかコンソールには表示されません。

 そして作成されたlog.txtファイルを開くと以下のように10~19が記述されています。

 このようにちゃんとファイルに出力する部分とコンソールに表示させる部分を切り替えられていることがわかります。


 以上がpythonでprintの表示内容をファイルに出力する方法になります。

 この方法を使うのはかなり特殊な場合かとは思いますが、この方法を使いたい時が自分に発生したので記事にした次第です。


・参考資料