print
関数にはいくつかの便利なオプションがある
# スペース以外で接続する
print("xxx", "yyyy", "zzzz", sep="-") # xxx-yyyy-zzzz
# 改行しない(改行コード以外で終わる)
print("xxx", end=" ")
print("yyyy", end=" ")
print("zzzz", end=" ") # xxx yyyy zzzz
# print実行時に強制的に出力させる
print("xxx", flush=True)
特に最後のflush=True
は、python xxx.py > out.log
のように出力ファイルを指定した時に、出力がなかなか書き込まれないデフォルト設定が解消される。
毎回オプションを入力するのが面倒
長いコードで複数箇所にprint()
があるといちいちオプションを追加するのが面倒くさい。
そんなときは、関数への部分入力を行うfunctools.partial
を使う。
import functools
print = functools.partial(print, flush=True)
これで、print()
のなかで常にflush=True
の状態になる。
念のため動作確認。
print_test.py
import time
# import functools
# print = functools.partial(print, flush=True)
for i in range(100):
print(i)
time.sleep(1)
このコードを、python print_test.py > out.log
のように実行する。コメントアウトの部分を含めるか否かで、コード実行時にout.logが逐次更新されるかされないかが変わる。
編集後記
本記事を書いたら関連記事でコンソール出力の上書きが簡単にできる(リンク)ことを知ったのでやってみた。
print_test-console.py
import time
import functools
print = functools.partial(print, end="\r")
for i in range(100):
print(i)
time.sleep(1)
これで1秒ごとにコンソール出力の数字が上書きされる。すごい。
(ファイル出力では改行になってしまうので注意。)