Pythonでcontextlibを使用してファイルの読み書きを行う

スポンサーリンク

Pythonでcontextlibを使用してファイルの読み書きを行ってみます。

今回はcontextlibを用います。このライブラリ・モジュールはPythonの標準ライブラリですので、事前にインストールする必要はありません。

なお、contextlibを用いることでコンテキストマネージャを作成できます。コンテキストマネージャは、Pythonの機能の一つで、特定の処理を実行する前後に、必要なリソースの確保と解放を自動的に行うための手段です。これにより、コードをより安全かつ効率的に記述することができます。

■Python

今回のPythonのバージョンは、「3.10.9」を使用しています。(Windows11)(pythonランチャーでの確認)

■contextlibを使用してファイルの読み書きを行う

Pythonのcontextlibを使用してファイルの読み書きを行うスクリプトを書いていきます。

■コード

from contextlib import contextmanager

# 自作のコンテキストマネージャを作成します
@contextmanager
def file_manager(file_name, mode):
    try:
        file = open(file_name, mode)
        yield file  # withブロック内でこの行までが実行されます
    finally:
        file.close()  # withブロックを抜ける際に必ず実行されます

# 使い方
file_name = "example.txt"

# ファイルへの書き込み
with file_manager(file_name, 'w') as file:
    file.write("Hello, contextlib!")

# ファイルからの読み込み
with file_manager(file_name, 'r') as file:
    content = file.read()
    print(content)

まずはcontextlibモジュールからcontextmanagerデコレータをインポートします。このデコレータを使用すると、関数をコンテキストマネージャとして使用できるようになります。

file_managerという関数は、独自のコンテキストマネージャを作成するためのものです。この関数は、ファイル名とモード(読み書き用途)を引数,パラメータとして受け取ります。その後、`@contextmanager`デコレータが関数の前に付けられています。これにより、この関数をコンテキストマネージャとして使用できるようになります。

関数の中身は以下のようになります。

1. `try`ブロック内で、`open`関数を使用して指定されたファイルを指定されたモードで開きます。
2. `yield file`という行が実行されます。`yield`文は、コンテキスト内のコードブロックを実行する前と後で実行される部分を区切るために使用されます。この場合、ファイルオブジェクトがコンテキスト内のコードブロックに渡されます。
3. `finally`ブロック内では、ファイルを必ずクローズする処理が行われます。これにより、コンテキストを抜ける際にファイルが正しく閉じられます。

使い方の部分は、この自作のコンテキストマネージャを使用してファイルへの書き込みと読み込みを行っています。

1. `with file_manager(file_name, ‘w’) as file:`という行では、`file_manager`コンテキストマネージャを使用して、指定したファイルを書き込みモードで開きます。`as file`によってファイルオブジェクトが変数`file`に割り当てられます。このブロック内でファイルへの書き込みが行われます。
2. 同様に、`with file_manager(file_name, ‘r’) as file:`のブロックでは、読み込みモードでファイルを開き、ファイルからの読み込みが行われます。読み込まれたデータをprint関数で出力します。

■実行・検証

このスクリプトを「test_c.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、contextlibを使用しファイルの書き込みを行い、その後ファイル内のデータを読み込みし、データを出力させることができました。

出力後、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)内を確認すると、example.txtというテキストファイルが生成されていることも確認できました。

コメント

タイトルとURLをコピーしました