ホームページ > バックエンド開発 > Python チュートリアル > aiofiles と asyncio を使用した Python でのファイルの非同期操作

aiofiles と asyncio を使用した Python でのファイルの非同期操作

DDD
リリース: 2025-01-15 09:52:44
オリジナル
780 人が閲覧しました

非同期コードは 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 ファイルを使用します。これらすべてが含まれるフォルダーをここからダウンロードできます。これで、次に進んでコードを書く準備が整ったはずです。

aiofile を使用したファイルからの読み取り

まず、特定のポケモンに対応するファイルを開き、その 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
ログイン後にコピー
ログイン後にコピー

aiofile を使用したファイルへの書き込み

ファイルへの書き込みも、標準の 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 行のファイルが表示されるはずです。

A screenshot of the rhydon_moves.txt file

asyncio を使用して多くのファイルを非同期的に処理する

ここで、もう少し複雑にして、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 ファイルが追加され、各ポケモンに対応する技リストが含まれることが表示されます。

A screenshot of the files in the directory

いくつかの非同期アクションを実行する必要があり、ファイルを書き込んだ後の各ポケモンの動きのリストなど、それらの非同期タスクに対応するデータで終了したい場合は、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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート