とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

Python withを使ったファイルの読み書き(お作法)

WindowsでPython シリーズ その27


前回はファイル操作の基本的な記述を書きましたが、
今回はより実践的な、というよりも必須の記述を学びます。

前回のコード


前回は以下のようなコードでした。


この書き方は、確かにお目当ての動作はするのですが、実践ではこんな書き方をしてはいけません。

ファイルを安全に必ず閉じる記述が必要


全てのプログラム言語において、プログラムの動作とは別の何かを操作する場合、
必ずその別の何かを安全に開放する処理を記載する必要があります。

例えばファイル、データベース、OSそのもの、など。
Python言語だけで完結しない(Pythonからすれば)外部のモノを操作する時に
Pythonが外部のモノを壊したりしないように考慮する必要があります。

「借りたものは大切に扱う」

そんな感じですね。

ファイルが必ず閉じるようにする記載


前回のプログラムを書き換えます。

try .. finally でやった、途中で、例えば何かプログラムに不具合があっても、必ずファイルがクローズされる finally を書きます。



実行結果
Python ファイルの読み書きのお作法

実行結果は特に差はありませんが、
もし、ファイルの書き込み中にエラーが発生しても、必ず f.close() が呼び出されるようになります。

更に実践的なwith句でスコープ管理


さらにプログラムを書き換えます。



ファイルを操作する時は、この書き方が基本だと認識しておいてください。

書き方の例はこの当たりを参照

先ほどと違って、try ~ finally がなく、更に f.close() がありません。
それでも、withのブロックが終わる時にファイルが閉じられます。

なぜか?

with句 を使えば、自動的必ずf.close() が呼ばれる事が保証されているからです。

Pythonというプログラム言語の実装は、PEP 343 というコーディング規約を規範にしています。

これによると、外部のナニかを操作する時は、try ~ finally を実装し、
with句によって、finally が呼ばれることを保証するというコーディングが推奨されており、Pythonはそれに準拠しているからですね。

withの最後で何が呼ばれるかをどうやって定義しているの?


ここで気になることがあります。
withを指定すれば、最後にclose()が呼ばれるということは分かった。

だけど、例えば自分で同じような処理を実装する時に
どうやって finally (つまりwithブロックの終わりに) でclose() が呼ばれることを保証する定義をするの?

というのが次の疑問です。

うん、正直、まだ調べてないんだ!
C# で言うところの、IDisposeインターフェース的な定義があるんだろうと思ってます。
これはまたの機会に!

今回はファイル操作を行う時はwithを使う。それだけを記憶の片隅に置いておきます!
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/188-44b19ffe
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad