Python redirect_stdout redirect_stderr

Python学習【365日チャレンジ!】269日目のマスターU(@Udemy11)です。

風の強い日が続いていたので、エギングには行けてなかったのですが、久しぶりに風がなさそうだったので、短時間の釣行に行ってきました。

人がほとんどいなかったため、だめなのかなと思いつつキャストを繰り返していると「根がかり?」のような引っかかる感じがあったので、ゆっくりロッドを立ててみるとグッと引っ張られるような生体反応!

なんとかグッドサイズのアオリイカをゲットでき、天ぷらで美味しくいただきました。

アオリイカの天ぷら

イカが釣れるって最高ですね。

それでは、今日もPython学習を始めましょう。

昨日の復習

昨日は、値の受け渡しに関わるstdinstdout、エラーのコントロールに関わるstderrを学習しました。

システムの裏方で入力や出力、エラーを受け渡しするためのストリームがデータをやりとししているので、それぞれの値を活用することができました。

詳細は昨日の記事をごらんください。

今日は、stdoutstderrでファイルに書き出す方法を学習します。

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.logwithステートメントで開きます(もしくは作成)。

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!う