Python学習【365日チャレンジ!】269日目のマスターU(@Udemy11)です。
風の強い日が続いていたので、エギングには行けてなかったのですが、久しぶりに風がなさそうだったので、短時間の釣行に行ってきました。
人がほとんどいなかったため、だめなのかなと思いつつキャストを繰り返していると「根がかり?」のような引っかかる感じがあったので、ゆっくりロッドを立ててみるとグッと引っ張られるような生体反応!
なんとかグッドサイズのアオリイカをゲットでき、天ぷらで美味しくいただきました。
イカが釣れるって最高ですね。
それでは、今日もPython学習を始めましょう。
昨日の復習
昨日は、値の受け渡しに関わるstdin
、stdout
、エラーのコントロールに関わるstderr
を学習しました。
システムの裏方で入力や出力、エラーを受け渡しするためのストリームがデータをやりとししているので、それぞれの値を活用することができました。
詳細は昨日の記事をごらんください。
今日は、stdout
、stderr
でファイルに書き出す方法を学習します。
contextlib.redirect_stdout
contextlib.redirect_stdout
を使えば、コンソールに出力するだけではなく、ファイルに書き出すことができます。
import contextlib
with open('stdout.log', 'w') as f:
with contextlib.redirect_stdout(f):
print('stdout_test')
stdout.log
stdout_test
最初にcontextlib
をインポートして、3行目でstdout.log
をwith
ステートメントで開きます(もしくは作成)。
4行目で、redirect_stdout
を使って開いたもしくは作成したファイルに、5行目の出力を書き込みます。
最後にwith
ステートメントでファイルを閉じています。
コンソールの出力には何も表示されませんが、プロジェクト内にstdout.log
が作成されて中身にはstdout_test
という文字列が保存されています。
context.redirect_stderr
次にエラーの出力をredirect_stderr
を使って出力してみます。
import contextlib
import logging
with open('stderr.log', 'w') as f:
with contextlib.redirect_stderr(f):
logging.error('error test')
stderr.log
error test
stdout
のときと違うところはlogging
をインポートしているのと、6行目にlogging.error
の出力コードになっているところです。
redirect_stderr
は、エラーのシグナルを受け取るので、6行目でprint
出力をしようとしてもファイルには何も書き込まれず、コンソールに入れた値が出力されるだけです。
まとめ
どちらもwith
ステートメントでファイルを作成(もしくは開く)して書き込むという作業は同じなので、使い方は覚えやすいのではないでしょうか?
このようなコードでさり気なくwith
ステートメントを使ってファイルを作成したりするときは、過去の復習をする絶好のチャンスなので、わからないところは過去の記事できちんと復習しておきましょう。
コードを書いていて思うのは、何度も繰り返して触れたコードと1度だけさらっとみたコードでは記憶に残る確率が全く違ってきます。
単純に数多く触れたものは覚えやすく、1回だけでは、なかなか記憶として定着しないので、たまに過去の復習を読み返してみるのもいいかもしませんよ!〜
ということで、明日もGood Python!う