【问题标题】:Getting only filenames from S3 bucket without downloading files仅从 S3 存储桶获取文件名而不下载文件
【发布时间】:2020-02-04 07:24:25
【问题描述】:

我有一个包含 4+ 百万个文件 (50GB+) 的存储桶。我想在不下载文件的情况下使用 Python 获取文件列表(没有数据)。

files = s3_bucket.objects.filter(Prefix='myPrefix')

# print(len(list(files_raw)))
for key in files:
    print(key.last_modified)

我有类似的东西,但我注意到有很多数据来自网络。

我试图查看 ObjectSummary 的文档,我希望它只下载元数据。 ObjectSummaryHEAD operation

HEAD 操作从对象中检索元数据而不返回 对象本身。如果您只感兴趣,此操作很有用 在对象的元数据中。要使用 HEAD,您必须对 对象。

HEAD 请求与对象上的 GET 操作具有相同的选项。 响应与 GET 响应相同,只是没有 响应正文。

是否仍然需要下载整个文件才能检索文件名?

【问题讨论】:

    标签: python python-3.x amazon-s3


    【解决方案1】:

    在 boto3 中使用 resource 方法时,请求实际上会被转换为其他 API 调用。但是,要看到“幕后”发生了什么调用并不容易。有时一种方法可以转化为多次调用(例如ListObjectsHeadObject)。

    您可以考虑使用 client 调用方法,因为它们将 1:1 映射到 AWS 上的 API 调用:

    import boto3
    
    s3_client = boto3.client('s3')
    
    paginator = s3_client.get_paginator('list_objects_v2')
    
    response_iterator = paginator.paginate(Bucket='bucket-name')
    
    for page in response_iterator:
        for object in page['Contents']:
            print(object['Key'], object['LastModified'])
    

    我还建议您查看Amazon S3 Inventory。它可以提供包含所有对象及其元数据列表的每日 CSV 文件。这对于大型存储桶(例如您的)非常有用。

    【讨论】:

    • 有趣。我在一个带有大文件的不同存储桶上做了一些测试,我可以确认只下载了元数据。这也适用于我帖子中的原始代码。当我在包含数百万个文件的存储桶上执行时,我想会有很多开销,因为超过 12GB 是通过网络传输的(我使用了 ShaPlus 带宽计)并且花费了 40 多分钟。
    • 更有理由使用 Amazon S3 Inventory!
    猜你喜欢
    • 2020-04-01
    • 2015-05-20
    • 1970-01-01
    • 2017-02-16
    • 2013-10-15
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多