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

使用 aiofiles 和 asyncio 在 Python 中异步处理文件

Jan 15, 2025 am 09:52 AM

异步代码已成为 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

热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

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

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
Python vs.C:申请和用例 Python vs.C:申请和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

Python:游戏,Guis等 Python:游戏,Guis等 Apr 13, 2025 am 12:14 AM

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

Python与C:学习曲线和易用性 Python与C:学习曲线和易用性 Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

Python和时间:充分利用您的学习时间 Python和时间:充分利用您的学习时间 Apr 14, 2025 am 12:02 AM

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python vs.C:探索性能和效率 Python vs.C:探索性能和效率 Apr 18, 2025 am 12:20 AM

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python标准库的哪一部分是:列表或数组? Python标准库的哪一部分是:列表或数组? Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

学习Python:2小时的每日学习是否足够? 学习Python:2小时的每日学习是否足够? Apr 18, 2025 am 12:22 AM

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python:自动化,脚本和任务管理 Python:自动化,脚本和任务管理 Apr 16, 2025 am 12:14 AM

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

See all articles