如何使用asyncio下载s3存储桶上的文件

2024-02-11

我使用以下代码下载 s3 存储桶中的所有文件:

def main(bucket_name, destination_dir):
    bucket = boto3.resource('s3').Bucket(bucket_name)
    for obj in bucket.objects.all():
        if obj.key.endswith('/'):
            continue
        destination = '%s/%s' % (bucket_name, obj.key)
        if not os.path.exists(destination):
            os.makedirs(os.path.dirname(destination), exist_ok=True)
        bucket.download_file(obj.key, destination)

如果可能的话,我想知道如何使其异步。

提前谢谢你。


您可以使用generate_presigned_urls3 客户端的方法来获取带有 AWS 凭证的 URL(请参阅docs https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html),然后通过异步 HTTP 客户端发送下载文件的请求(aiohttp https://docs.aiohttp.org/en/stable/client_reference.html例如)

aiohttp 应用 URL 规范化,如果密钥包含空格或非 ASCII 字符,这可能会导致问题。使用URL(..., encoded=True)将解决这个问题。

import boto3
import asyncio
from aiohttp import client
from yarl import URL

bucket = 'some-bucket-name'

s3_client = boto3.client('s3')
s3_objs = s3_client.list_objects(Bucket=bucket)['Contents']

async def download_s3_obj(key: str, aiohttp_session: client.ClientSession):
    request_url = s3_client.generate_presigned_url('get_object', {
        'Bucket': bucket,
        'Key': key
    })

    async with aiohttp_session.get(URL(request_url, encoded=True)) as response:
        file_path = 'some-local-folder-name/' + key.split('/')[-1]

        with open(file_path, 'wb') as file:
            file.write(await response.read())

async def get_tasks():
    session = client.ClientSession()

    return [download_s3_obj(f['Key'], session) for f in s3_objs], session

loop = asyncio.get_event_loop()
tasks, session = loop.run_until_complete(get_tasks())
loop.run_until_complete(asyncio.gather(*tasks))

loop.run_until_complete(session.close())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用asyncio下载s3存储桶上的文件 的相关文章

随机推荐

  • 如何在 Android 上将文件从内部应用程序存储移动/重命名到外部存储?

    我正在从互联网下载文件并将流数据保存到我的应用程序内部存储中的临时文件中获取文件目录 http developer android com reference android content Context html getFilesDir
  • IllegalArgumentException:类 TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean 中没有可见的构造函数

    我正在尝试使用 h2 数据库为 Spring Boot JPA 应用程序编写集成测试 不知何故 TestEntityManager 没有被创建 我尝试在论坛上寻找一些帮助 但找不到任何相关信息 感谢任何人可以提供帮助或提供一些指导 Than
  • 将 wc 行附加到文件名

    标题说明了一切 我已经设法得到这样的行 lines wc file txt awk print 1 但我可以使用辅助功能将其附加到文件名中 向我展示如何循环遍历当前目录中的所有 txt 文件的奖励积分 find name txt execd
  • 在 mac、ios、linux 上使用 calibri 风格

    由于 Windows 操作系统中存在 calibri 样式 但 linux mac ios 中不存在 calibri 样式 如果我的项目仅在 calibri 中具有其样式 并且我必须严格使用它 那么如果用户使用linux 并运行我的项目 那
  • 在android中使用Geocoder获取地址

    我尝试通过提供静态地理坐标来获取特定位置的地址 我无法获取地址 有人可以帮忙吗 我只需要检查这个功能是否适合我 这是我的片段 Geocoder geocoder new Geocoder AddressSimulator this Loca
  • 如何使用 docker-compose 将环境变量设置到 docker 容器中

    我想设置凭据以使用 Google Translate Api 客户端 因此我必须设置环境变量GOOGLE APPLICATION CREDENTIALS该值是凭证文件的路径 来自 Google Cloud 当我被利用的时候docker bu
  • 将未知长度的 char** (c) 转换为 vector (c++) [重复]

    这个问题在这里已经有答案了 如何将 C char 转换为 C 矢量 是否有一些内置功能可以用来做到这一点 或者通过一系列迭代步骤来完成它是否更好 编辑 由于各种原因 C 数组中的元素数量未知 我可以将其作为另一个参数传递 但这绝对有必要吗
  • 如何在反应中使用复选框形式?

    有两个组件container and presenter 下面的代码显示单个复选框状态变为 true 并且另一个复选框也正在更新 那么 如何处理具有状态的多个复选框 容器 export default class ApplyFormCont
  • 为什么点击设置innerHTML会在Chrome上触发两个解析事件?

    使用Chrome开发者工具中的时间轴 我使用了这一小段代码来记录事件内部HTML
  • 如何分发 Android 库

    我一直在为 android 库项目旋转一个 jar 并将这个 jar 包含在我的其他应用程序中 但在developer android com上 http developer android com tools projects index
  • REST API 404:URI 错误或缺少资源?

    我正在构建 REST API 但遇到了问题 设计 REST API 时公认的做法似乎是 如果请求的资源不存在 则返回 404 然而 对我来说 这增加了不必要的歧义 传统上 HTTP 404 与错误的 URI 相关 所以实际上我们是说 要么你
  • 将 ILMerge 与 .NET 4 库结合使用

    两个问题 1 基本 NET 程序集不包含在 ILMerged 程序集中 从 NET 3 5 Visual Studio 2008 升级到 NET 4 Visual Studio 2010 后 我在构建后使用 ILMerge 时遇到问题 我有
  • 以列表作为参数的 defun

    我正在尝试选择 Lisp 作为我的新语言 但我在解决如何让函数的一部分作用于传递给它的列表的每个元素上时遇到了一些问题 为了学习如何解决这个问题 我试图编写一个相当基本的除法形式 当列表的一个元素为 0 时不会发出声音 而是只返回 0 de
  • Java 中 String 享元实现的最佳替代方案

    我的应用程序是多线程的 具有密集的字符串处理 我们遇到内存消耗过多的情况 分析表明这是由字符串数据引起的 我认为使用某种享元模式实现甚至缓存会极大地提高内存消耗 我确信字符串经常是重复的 尽管我在这方面没有任何硬数据 我研究过 Java C
  • 如何在关闭网页时丢弃会话变量?

    我们在开发网页时遵循的一个流程 是将页面绑定到一个或多个会话变量 这些会话变量仅用于该页面 用于保存当前处理对象 因此在关闭页面时不需要它们 如何在关闭页面时丢弃这些会话变量 关于该技术或如何解决该问题有什么建议吗 离开 关闭页面时不会引发
  • 如何以编程方式监视 docker 容器是否退出?

    我在 VM 主机上运行多个命名的 docker 容器 200 多个 我有一个管理器脚本 代码 应该从主机管理容器 我想知道是否有任何基于事件的机制可以在容器停止 失败时收到通知 这样我就可以重新启动已停止的容器 我能想到的一个解决方案是定期
  • 何时使用枚举、类或标签?

    假设您有一个特定页面类型的页面 例如普通页面 帐户页面等 页面由 Page 对象表示 我的问题是 如何为页面分配页面类型 我看到这些选项 通过使用 Page 对象中设置的 PageType 枚举 通过使用 PageType 类 并在 Pag
  • 如何使用每列以前的值填充缺失的信息? [复制]

    这个问题在这里已经有答案了 可能的重复 用最新的非 NA 值替换 NA https stackoverflow com questions 7735647 replacing nas with latest non na value 如何使
  • 如何更改node.js中process.env.PORT的值?

    我想改变的值process env PORT 我怎样才能做到这一点 我运行的是 Ubuntu 12 04 仅运行一次 在 unix shell 提示符下 PORT 1234 node app js 更永久 export PORT 1234
  • 如何使用asyncio下载s3存储桶上的文件

    我使用以下代码下载 s3 存储桶中的所有文件 def main bucket name destination dir bucket boto3 resource s3 Bucket bucket name for obj in bucke