Pythonのcontextlibを用いてファイルのオープンとクローズを管理するクラスを定義してみます。
今回はcontextlibを用います。このライブラリ・モジュールはPythonの標準ライブラリですので、事前にインストールする必要はありません。
■Python
今回のPythonのバージョンは、「3.10.9」を使用しています。(Windows11)(pythonランチャーでの確認)
■contextlibを用いてファイルのオープンとクローズを管理するクラスの定義
では、早速contextlibを用いてファイルのオープンとクローズを管理するクラスを定義し、実装するスクリプトを書いていきます。
■コード
import contextlib class FileHandler: def __init__(self, filename, mode): self.filename = filename self.mode = mode self.file = None def __enter__(self): self.file = open(self.filename, self.mode) return self.file def __exit__(self, exc_type, exc_value, traceback): if self.file: self.file.close() # テキストファイルを読み書きする例 filename = "example.txt" # ファイルを書き込みモードで開く with FileHandler(filename, 'w') as file: file.write("Hello, contextlib!\n") file.write("This is an example of using contextlib.\n") # ファイルを読み取りモードで開き、内容を表示 with FileHandler(filename, 'r') as file: content = file.read() print("File content:") print(content)
まずはcontextlibモジュールをインポートします。このモジュールは、コンテキストマネージャを作成するためのユーティリティ関数やクラスを提供します。
次にFileHandlerクラスは、コンテキストマネージャとして振る舞うための特殊メソッド __enter__ と __exit__ を定義します。
・__init__: インスタンスを初期化するためのコンストラクタです。ファイル名とモード(読み書きモード)を受け取り、インスタンス変数に格納します。
・__enter__: コンテキストが入る時に呼び出されるメソッドです。ファイルを指定されたモードで開き、そのファイルオブジェクトを返します。このファイルオブジェクトはコンテキスト内で使用されます。
・__exit__: コンテキストを抜ける時に呼び出されるメソッドです。ここでは、ファイルが開かれている場合にはファイルを閉じます。また、例外が発生した場合にも適切に処理を行います。
次にファイルの書き込みと読み取りを行います。ファイルの書き込みと読み取りはそれぞれ別々のコンテキストで行われています。with文を使用してコンテキスト内でファイル操作を行うことで、ファイルが適切に開かれていて、処理が終了した後に自動的にファイルが閉じられることが保証されます。
■実行・検証
このスクリプトを「c_f_test.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると、contextlibを使用しファイルの書き込みを行い、その後読み取られた内容が出力されることを確認できました。
確認後、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)内に「example.txt」というテキストファイルが生成され、生成されたファイルの内容を確認すると、指定したデータの書き込みが行われていました。
コメント