如何在不下载的情况下计算AWS S3中zip内的文件数量?

2024-03-10

案件: S3 存储桶中有一个很大的 zip 文件,其中包含大量图像。有没有一种方法无需下载整个文件即可读取元数据或知道 zip 文件中有多少个文件?

当文件是本地文件时,在 python 中,我可以将其作为 zipfile() 打开,然后调用 namelist() 方法,该方法返回内部所有文件的列表,我可以对其进行计数。但是,当文件驻留在 S3 中而无需下载时,不确定如何执行此操作。另外,如果 Lambda 可以实现这一点那就最好了。


我认为这会解决你的问题:

import zlib
import zipfile
import io

def fetch(key_name, start, len, client_s3):
    """
    range-fetches a S3 key
    """
    end = start + len - 1
    s3_object = client_s3.get_object(Bucket=bucket_name, Key=key_name, Range="bytes=%d-%d" % (start, end))
    return s3_object['Body'].read()


def parse_int(bytes):
    """
    parses 2 or 4 little-endian bits into their corresponding integer value
    """
    val = (bytes[0]) + ((bytes[1]) << 8)
    if len(bytes) > 3:
        val += ((bytes[2]) << 16) + ((bytes[3]) << 24)
    return val


def list_files_in_s3_zipped_object(bucket_name, key_name, client_s3):
    """

    List files in s3 zipped object, without downloading it. Returns the number of files inside the zip file.
    See : https://stackoverflow.com/questions/41789176/how-to-count-files-inside-zip-in-aws-s3-without-downloading-it
    Based on : https://stackoverflow.com/questions/51351000/read-zip-files-from-s3-without-downloading-the-entire-file


    bucket_name: name of the bucket
    key_name:  path to zipfile inside bucket
    client_s3: an object created using boto3.client("s3")
    """

    bucket = bucket_name
    key = key_name

    response = client_s3.head_object(Bucket=bucket_name, Key=key_name)
    size = response['ContentLength']

    eocd = fetch(key_name, size - 22, 22, client_s3)

    # start offset and size of the central directory
    cd_start = parse_int(eocd[16:20])
    cd_size = parse_int(eocd[12:16])

    # fetch central directory, append EOCD, and open as zipfile!
    cd = fetch(key_name, cd_start, cd_size, client_s3)
    zip = zipfile.ZipFile(io.BytesIO(cd + eocd))

    print("there are %s files in the zipfile" % len(zip.filelist))

    for entry in zip.filelist:
        print("filename: %s (%s bytes uncompressed)" % (entry.filename, entry.file_size))
    return len(zip.filelist)

if __name__ == "__main__":
    import boto3
    import sys

    client_s3 = boto3.client("s3")
    bucket_name = sys.argv[1]
    key_name = sys.argv[2]
    list_files_in_s3_zipped_object(bucket_name, key_name, client_s3)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不下载的情况下计算AWS S3中zip内的文件数量? 的相关文章

随机推荐

  • 如何使用Linux路径中的变量值来显示内容?

    我一直坚持在 Linux 路径中使用 python 变量来显示内容 任何建议 指导 提示都会非常有帮助 下面是我的Python脚本 bin python import sys import os db sys argv 1 type sys
  • Facebook Like 按钮从外部 URL 更改为 Facebook 页面

    我有一个主页上有 Facebook Like 按钮的网站 赞 按钮的 URL 是 www domain com 我有一群喜欢我的 URL 的用户 一段时间后 我为我的网站创建了一个 Facebook 页面 并将 赞 按钮的目标更改为 Fac
  • WLContext.close() 在与创建它的线程不同的线程中调用

    我编写了 wlst 脚本来递归地实现以下任务 停止应用程序 取消部署应用程序 部署应用程序 当我执行脚本时 仅 1 个应用程序会取消部署或部署 对于其他应用程序 它会失败并显示以下错误消息 您能帮我解决这个问题吗 File
  • 用 Excel VBA 中的函数替换单元格区域

    我必须在 Excel 文件中将一个字符替换为另一个字符 我用过以下Replace函数 但由于某些单元格超出 1024 个字符限制 因此停止 Sub Replace With Sheets Sheet1 Range A1 A629 Cells
  • 变量中带有正则表达式的常规 if 语句

    我想删除以 AAA 开头的 Jenkins 作业列表 例如 当我使用显式字符串执行此操作时 效果很好 if item name AAA item delete 但是当我尝试从 Jenkins Build 属性获取正则表达式时 我失败了并且
  • 如何禁止wordpress url将`&`交换为`#038;`?

    我想通过wordpress中的url传递一些值 但是我遇到了wordpress交换的一些问题 to 038 自动 如何制作 仍然作为 我注意到在wp includes formatting php 有很多交换符号的规则 我尝试修改一些代码
  • Android Room Multimap 相同列名称的问题

    如中所述官方文档 https developer android com training data storage room relationships multimap 最好对 Android Room 数据库使用 Multimap 返
  • 减少撰写中可滚动选项卡之间的间距

    我正在尝试创建一个动画 其中有水平滚动的可滚动组件 就像是 我想过使用可滚动选项卡 它在某种程度上有效 除了我仍在研究如何减少您在上面的 gif 中看到的裁剪项目之间的空间 我已经尝试过什么 Composable fun CropBar o
  • 如何在angular2 router3中为子路由指定辅助组件

    我正在使用新的route3 并且想知道为子路由指定辅助组件的URL 语法是什么 我有以下子路由定义 const router RouterConfig path component c component ComponentC childr
  • 为什么要重新抛出异常

    在 C 中 为什么要重新抛出异常 为什么不让当前的catch块处理异常呢 出于什么原因 您会将异常重新抛出到另一个 try catch 块 当函数无法满足其约定 它向调用者承诺它将执行的操作 时 会引发异常 当一个函数调用另一个抛出异常的函
  • Asp.Net MVC 输入验证在禁用后仍然触发

    我已经禁用了validateRequest在我的 web Config 中 但应用程序仍然引发错误 从客户端检测到潜在危险的 Request Form 值 我的 web Config 中有以下内容
  • 如何使用 Javascript 从输入字段获取值?

    如何使用 Javascript 获取特定输入字段的值 我们以这家shopify商店为例 https geekymate com products magic doormat 1 variant 18941211607138 https ge
  • 如何在 Swift 3 中使用带有浮点值的 sin(_ : ) [重复]

    这个问题在这里已经有答案了 import Foundation public func sine
  • 无需管理员权限即可启动和停止 Windows 服务

    如何在没有管理员权限的情况下启动和停止窗口服务 我的应用程序启动应该以与关闭后必须停止的方式相同的方式启动我的服务 我可以使用 服务控制器 来做到这一点 我可以使用管理员权限安装该服务 但启动和停止该服务不应要求管理员权限 谁能告诉我如何使
  • SSLProtocolException 建立 https 连接

    当我与网络服务器建立 https 连接时 出现 SSLProtocolException 我只在 Android 2 3 Gingebread 中有这个例外 相同的代码在所有其他 Android 版本中都可以正常工作 这个安卓版本有问题吗
  • 并非所有字节都读取常见解决方案

    在这篇文章中 我将详细介绍导致神秘错误消息的原因 Smart contract panicked panicked at Cannot deserialize the contract state Custom kind InvalidDa
  • 以编程方式修改 ActionBarDrawerToggle Drawable

    有谁知道在构造函数中通过资源 ID 设置用于 ActionBarDrawerToggle 的可绘制对象的方法吗 我正在使用导航抽屉 我想以编程方式将颜色过滤器应用于图标 但我不知道如何将其作为可绘制对象进行访问 任何帮助 将不胜感激 谢谢
  • 试运行中的 sed 命令

    如何进行空运行sed 我有这个命令 find type f xargs sed i s string1 string2 g 但在我真正替换所有文件之前 我想检查它会替换什么 复制整个目录结构来检查是不可能的 去除 i并将其通过管道传输到le
  • 通过 aws ses 发送带有 Node.js 附件的邮件

    有谁有一些如何发送带有附件的电子邮件的示例node js与 aws ses 一起吗 如果你想避免痛苦 你必须使用 Nodemailer 包装的 SES 直接使用AWS SDK 您无法使用以下方式发送附件ses sendEmail 你必须使用
  • 如何在不下载的情况下计算AWS S3中zip内的文件数量?

    案件 S3 存储桶中有一个很大的 zip 文件 其中包含大量图像 有没有一种方法无需下载整个文件即可读取元数据或知道 zip 文件中有多少个文件 当文件是本地文件时 在 python 中 我可以将其作为 zipfile 打开 然后调用 na