搜索
首页后端开发Python教程使用 aiofiles 和 asyncio 在 Python 中异步处理文件

异步代码已成为 Python 开发的支柱。随着 asyncio 成为标准库的一部分,并且许多第三方软件包提供与其兼容的功能,这种范例不会很快消失。

如果您正在编写异步代码,请务必确保代码的所有部分都能协同工作,这样其中的一个方面就不会减慢其他所有部分的速度。文件 I/O 可能是这方面的常见阻碍,因此让我们逐步了解如何使用 aiofiles 库异步处理文件。

从基础开始,这是异步读取文件内容所需的所有代码(在异步函数内):

async with aiofiles.open('filename', mode='r') as f:
    contents = await f.read()
print(contents)

让我们继续深入挖掘。

什么是非阻塞代码?

您可能会听到“异步”、“非阻塞”或“并发”等术语,但对它们的含义感到有点困惑。根据这个更详细的教程,两个主要属性是:

  • 异步例程能够在等待最终结果时“暂停”,以便让其他例程同时运行。
  • 异步代码,通过上面的机制,有利于并发执行。换句话说,异步代码给人一种并发的感觉。

因此,异步代码是可以在等待结果时挂起的代码,以便让其他代码同时运行。它不会“阻止”其他代码运行,因此我们可以将其称为“非阻塞”代码。

asyncio 库为 Python 开发人员提供了多种工具来执行此操作,aiofiles 提供了更具体的文件处理功能。

设置

在我们开始之前,请确保您已设置好 Python 环境。如果您需要帮助,请按照本指南的 virtualenv 部分进行操作。如果您有多个项目在同一台计算机上运行,​​那么让一切正常工作,特别是在虚拟环境方面,对于隔离依赖项非常重要。 您至少需要 Python 3.7 或更高版本才能运行本文中的代码。

现在您的环境已经设置完毕,您将需要安装一些第三方库。我们将使用 aiofiles,因此在激活虚拟环境后使用以下命令安装它:

pip install aiofiles==0.6.0

对于本文其余部分的示例,我们将使用与原始 150 个 Pokemon 相对应的 Pokemon API 数据的 JSON 文件。您可以在此处下载包含所有这些内容的文件夹。有了这个,您应该准备好继续编写一些代码。

使用 aiofiles 读取文件

首先,我们简单地打开一个与特定 Pokemon 对应的文件,将其 JSON 解析为字典,并打印出其名称:

async with aiofiles.open('filename', mode='r') as f:
    contents = await f.read()
print(contents)

运行此代码时,您应该看到“articuno”打印到终端。您还可以逐行异步迭代文件(此代码将打印出 articuno.json 的所有 9271 行):

pip install aiofiles==0.6.0

使用 aiofiles 写入文件

写入文件也类似于标准 Python 文件 I/O。假设我们想要创建包含每个神奇宝贝可以学习的所有动作列表的文件。举个简单的例子,下面是我们对 Pokemon Ditto 所做的事情,它只能学习“变形”这一招式:

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 个 Pokemon 执行此操作。我们的代码必须读取每个文件,解析 JSON,并将每个 Pokemon 的动作重写到一个新文件中:

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())

运行此代码后,您应该会看到 Pokemon 文件的目录,其中包含 .txt 文件和 .json 文件,其中包含与每个 Pokemon 对应的移动列表。

A screenshot of the files in the directory

如果您需要执行一些异步操作,并希望以与这些异步任务相对应的数据结束,例如在写入文件后列出每个 Pokemon 的动作列表,您可以使用 asyncio.ensure_future 和 asyncio.gather。

您可以将处理每个文件的代码部分分解为自己的异步函数,并将这些函数调用的承诺附加到任务列表中。以下是该函数的示例,以及您的新主函数的外观:

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 请求之类的事情。

那么我用这个做什么呢?

本文中使用 Pokemon 数据的示例只是展示 aiofiles 模块功能以及如何编写代码来导航文件目录以进行读写的借口。希望您可以根据您要解决的特定问题调整这些代码示例,以便文件 I/O 不会成为异步代码中的障碍。

我们只触及了 aiohttp 和 asyncio 功能的皮毛,但我希望这能让您更轻松地开始进入异步 Python 世界。

我期待看到您构建的内容。请随时与我们联系并分享您的经验或提出任何问题。

以上是使用 aiofiles 和 asyncio 在 Python 中异步处理文件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python的混合方法:编译和解释合并Python的混合方法:编译和解释合并May 08, 2025 am 12:16 AM

pythonuseshybridapprace,ComminingCompilationTobyTecoDeAndInterpretation.1)codeiscompiledtoplatform-Indepententbybytecode.2)bytecodeisisterpretedbybythepbybythepythonvirtualmachine,增强效率和通用性。

了解python的' for”和' then”循环之间的差异了解python的' for”和' then”循环之间的差异May 08, 2025 am 12:11 AM

theKeyDifferencesBetnewpython's“ for”和“ for”和“ loopsare:1)” for“ loopsareIdealForiteringSequenceSquencesSorkNowniterations,而2)”,而“ loopsareBetterforConterContinuingUntilacTientInditionIntionismetismetistismetistwithOutpredefinedInedIterations.un

Python串联列表与重复Python串联列表与重复May 08, 2025 am 12:09 AM

在Python中,可以通过多种方法连接列表并管理重复元素:1)使用 运算符或extend()方法可以保留所有重复元素;2)转换为集合再转回列表可以去除所有重复元素,但会丢失原有顺序;3)使用循环或列表推导式结合集合可以去除重复元素并保持原有顺序。

Python列表串联性能:速度比较Python列表串联性能:速度比较May 08, 2025 am 12:09 AM

fasteStmethodMethodMethodConcatenationInpythondependersonListsize:1)forsmalllists,operatorseffited.2)forlargerlists,list.extend.extend()orlistComprechensionfaster,withextendEffaster,withExtendEffers,withextend()withextend()是extextend()asmoremory-ememory-emmoremory-emmoremory-emmodifyinginglistsin-place-place-place。

您如何将元素插入python列表中?您如何将元素插入python列表中?May 08, 2025 am 12:07 AM

toInSerteLementIntoApythonList,useAppend()toaddtotheend,insert()foreSpificPosition,andextend()formultiplelements.1)useappend()foraddingsingleitemstotheend.2)useAddingsingLeitemStotheend.2)useeapecificindex,toadapecificindex,toadaSpecificIndex,toadaSpecificIndex,blyit'ssssssslorist.3 toaddextext.3

Python是否列表动态阵列或引擎盖下的链接列表?Python是否列表动态阵列或引擎盖下的链接列表?May 07, 2025 am 12:16 AM

pythonlistsareimplementedasdynamicarrays,notlinkedlists.1)他们areStoredIncoNtiguulMemoryBlocks,mayrequireRealLealLocationWhenAppendingItems,EmpactingPerformance.2)LinkesedlistSwoldOfferefeRefeRefeRefeRefficeInsertions/DeletionsButslowerIndexeDexedAccess,Lestpypytypypytypypytypy

如何从python列表中删除元素?如何从python列表中删除元素?May 07, 2025 am 12:15 AM

pythonoffersFourmainMethodStoreMoveElement Fromalist:1)删除(值)emovesthefirstoccurrenceofavalue,2)pop(index)emovesanderturnsanelementataSpecifiedIndex,3)delstatementremoveselemsbybybyselementbybyindexorslicebybyindexorslice,and 4)

试图运行脚本时,应该检查是否会遇到'权限拒绝”错误?试图运行脚本时,应该检查是否会遇到'权限拒绝”错误?May 07, 2025 am 12:12 AM

toresolvea“ dermissionded”错误Whenrunningascript,跟随台词:1)CheckAndAdjustTheScript'Spermissions ofchmod xmyscript.shtomakeitexecutable.2)nesureThEseRethEserethescriptistriptocriptibationalocatiforecationAdirectorywherewhereyOuhaveWritePerMissionsyOuhaveWritePermissionsyYouHaveWritePermissions,susteSyAsyOURHomeRecretectory。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器