Pythonでaiofileモジュールを使用し非同期にファイルを読み込み、書き込み

スポンサーリンク

Pythonでaiofileモジュールを使用し非同期にファイルを読み込み、書き込みを行ってみます。

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

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows11)

■ファイルの用意

まずはファイルの用意を行います。

今回は「input.txt」というtxt形式のテキストファイルを「C:\Users\user_(フォルダパス)」内に作成しました。なお、今回の「C:\Users\user_」は、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)となります。

■aiofileモジュールを使用し非同期にファイルを読み込み、書き込み

ファイルの用意ができましたので、aiofileモジュールを使用し非同期にファイルを読み込み、書き込みを行うスクリプトを書いていきます。

■コード

import asyncio
import aiofile

async def read_file(filename):
    async with aiofile.async_open(filename, mode='r') as file:
        contents = await file.read()
        return contents

async def write_file(filename, contents):
    async with aiofile.async_open(filename, mode='w') as file:
        await file.write(contents)

async def main():
    # ファイルの読み込み
    contents = await read_file('input.txt')
    print(f'読み込んだ内容: {contents}')

    # ファイルの書き込み
    new_contents = '新しい内容です'
    await write_file('output.txt', new_contents)
    print('ファイルに書き込みました')

asyncio.run(main())

まず、非同期I/O操作を行うために必要なasyncioとaiofileモジュールをインポートします。asyncioは非同期プログラミングをサポートするためのPythonの標準ライブラリであり、aiofileは非同期ファイル操作を行うためのサードパーティライブラリです。

次に非同期関数としてread_file関数を定義します。この関数は指定されたファイル名のファイルを非同期に読み込みます。aiofile.async_openを使用してファイルを開き、await file.read()でファイルの内容を非同期に読み込みます。最終的に、読み込まれた内容が返されます。

定義後、続けて非同期関数としてwrite_file関数も定義します。この関数は指定されたファイル名のファイルに指定された内容を非同期に書き込みます。aiofile.async_openを使用してファイルを開き、await file.write(contents)で指定された内容を非同期に書き込みます。

定義後、非同期関数として今度はメインとなるmain関数も定義します。これは実際の処理の流れを制御します。まず、read_file関数を使用してinput.txtの内容を非同期に読み込みます。次に、write_file関数を使用してoutput.txtに新しい内容を非同期に書き込みます。最後に結果を表示します。

最後に「asyncio.run(main())」と記述します。main関数を非同期コンテキスト内で実行するために、asyncio.run()関数を使用しています。asyncio.run(main())を呼び出すことで、非同期コンテキストが作成され、main関数が実行されます。

これにより、指定されたファイルから非同期に読み込みを行い、新しい内容を別のファイルに非同期に書き込むことができます。なお、input.txtというファイルがあらかじめ存在し、読み込み可能であり、output.txtには書き込みが許可されている必要があります。

■実行・検証

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

実行してみるとaiofileモジュールを使用し非同期にファイルを読み込み、読み込んだ内容を表示させ、なおかつファイル(output.txt)に指定した内容を書き込むことができました。

コメント

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