ホームページ >バックエンド開発 >Python チュートリアル >aiofiles と asyncio を使用した Python でのファイルの非同期操作
非同期コードは Python 開発の柱となっています。 asyncio が標準ライブラリの一部となり、多くのサードパーティ パッケージがそれと互換性のある機能を提供しているため、このパラダイムはすぐに消えることはありません。
非同期コードを作成している場合は、コードのすべての部分が連携して動作していることを確認し、コードの 1 つの側面が他の部分の速度を低下させないようにすることが重要です。ファイル I/O はこの面で一般的な障害となる可能性があるため、aiofiles ライブラリを使用してファイルを非同期的に操作する方法を見てみましょう。
基本から始めて、ファイルの内容を非同期で読み取るために (async 関数内で) 必要なコードはこれですべてです。
async with aiofiles.open('filename', mode='r') as f: contents = await f.read() print(contents)
次に進んで、さらに詳しく見ていきましょう。
「非同期」、「ノンブロッキング」、「同時」などの用語を聞いて、それらが何を意味するのか少し混乱するかもしれません。このより詳細なチュートリアルによると、主なプロパティのうちの 2 つは次のとおりです:
非同期コードとは、結果を待っている間に他のコードを実行できるようにするためにハングする可能性のあるコードのことです。他のコードの実行を「ブロック」しないので、「ノンブロッキング」コードと呼ぶことができます。
asyncio ライブラリは、Python 開発者がこれを行うためのさまざまなツールを提供し、aiofiles はファイルを操作するためのさらに具体的な機能を提供します。
始める前に、必ず Python 環境をセットアップしてください。ヘルプが必要な場合は、このガイドの virtualenv セクションを参照してください。同じマシン上で複数のプロジェクトを実行している場合、依存関係を分離するには、特に仮想環境に関して、すべてが正しく動作することが重要です。 この投稿のコードを実行するには、少なくとも Python 3.7 以降が必要です。
環境がセットアップされたので、いくつかのサードパーティ ライブラリをインストールする必要があります。 aiofile を使用するので、仮想環境をアクティブ化した後、次のコマンドを使用してこれをインストールします。
pip install aiofiles==0.6.0
この投稿の残りの部分の例では、元の 150 匹のポケモンに対応する Pokémon API データの JSON ファイルを使用します。これらすべてが含まれるフォルダーをここからダウンロードできます。これで、次に進んでコードを書く準備が整ったはずです。
まず、特定のポケモンに対応するファイルを開き、その JSON を解析して辞書にし、その名前を出力することから始めましょう。
async with aiofiles.open('filename', mode='r') as f: contents = await f.read() print(contents)
このコードを実行すると、端末に「articuno」が出力されるはずです。ファイルを 1 行ずつ非同期に反復処理することもできます (このコードは、articuno.json の 9271 行すべてを出力します):
pip install aiofiles==0.6.0
ファイルへの書き込みも、標準の Python ファイル I/O と似ています。各ポケモンが学習できるすべての技のリストを含むファイルを作成したいとします。簡単な例として、同じように「変身」という技しか覚えられないポケモンに対して行うことを示します。
import aiofiles import asyncio import json async def main(): async with aiofiles.open('articuno.json', mode='r') as f: contents = await f.read() pokemon = json.loads(contents) print(pokemon['name']) asyncio.run(main())
ライドンのような複数の技を持つポケモンでこれを試してみましょう:
import aiofiles import asyncio async def main(): async with aiofiles.open('articuno.json', mode='r') as f: async for line in f: print(line) asyncio.run(main())
rhydon_moves.txt を開くと、次のような内容で始まる 112 行のファイルが表示されるはずです。
ここで、もう少し複雑にして、JSON ファイルがある 150 匹すべてのポケモンに対してこれを実行してみましょう。私たちのコードは、すべてのファイルから読み取り、JSON を解析し、各ポケモンの動きを新しいファイルに書き換える必要があります:
import aiofiles import asyncio async def main(): async with aiofiles.open('ditto_moves.txt', mode='w') as f: await f.write('transform') asyncio.run(main())
このコードを実行すると、ポケモン ファイルのディレクトリに .json ファイルと並んで .txt ファイルが追加され、各ポケモンに対応する技リストが含まれることが表示されます。
いくつかの非同期アクションを実行する必要があり、ファイルを書き込んだ後の各ポケモンの動きのリストなど、それらの非同期タスクに対応するデータで終了したい場合は、asyncio.ensure_future と asyncio.gather を使用できます。
各ファイルを処理するコード部分を独自の非同期関数に分割し、それらの関数呼び出しの Promise をタスクのリストに追加できます。その関数と新しい main 関数がどのようになるかの例を次に示します。
import aiofiles import asyncio import json async def main(): # Read the contents of the json file. async with aiofiles.open('rhydon.json', mode='r') as f: contents = await f.read() # Load it into a dictionary and create a list of moves. pokemon = json.loads(contents) name = pokemon['name'] moves = [move['move']['name'] for move in pokemon['moves']] # Open a new file to write the list of moves into. async with aiofiles.open(f'{name}_moves.txt', mode='w') as f: await f.write('\n'.join(moves)) asyncio.run(main())
これは、Python で非同期コードを利用する一般的な方法であり、HTTP リクエストの作成などによく使用されます。
ポケモンからのデータを使用したこの投稿の例は、aiofiles モジュールの機能と、読み取りと書き込みのためにファイルのディレクトリ内を移動するコードをどのように記述するかを示すための単なる言い訳でした。ファイル I/O が非同期コードの妨げにならないように、これらのコード サンプルを解決しようとしている特定の問題に適応させることができれば幸いです。
ここでは、aiohttp と asyncio でできることのほんの表面をなぞっただけですが、これで非同期 Python の世界への旅をもう少し簡単に始められることを願っています。
あなたが何を構築するのか楽しみにしています。お気軽に連絡して、経験を共有したり、質問したりしてください。
以上がaiofiles と asyncio を使用した Python でのファイルの非同期操作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。