【问题标题】:How to recursively list files in AWS S3 bucket using AWS SDK for Python?如何使用 AWS SDK for Python 递归列出 AWS S3 存储桶中的文件?
【发布时间】:2016-08-26 13:32:14
【问题描述】:

我正在尝试复制 AWS CLI ls 命令以递归方式列出 AWS S3 存储桶中的文件。例如,我将使用以下命令递归列出“location2”存储桶中的所有文件。

aws s3 ls s3://location2 --recursive

什么是AWS SDK for Python(即boto3)相当于aws s3 ls s3://location2 --recursive

【问题讨论】:

    标签: python amazon-web-services amazon-s3 ls boto3


    【解决方案1】:

    使用 AWS 开发工具包时无需使用 --recursive 选项,因为它使用 list_objects 方法列出存储桶中的所有对象。

    import boto3 
    client = boto3.client('s3')
    client.list_objects(Bucket='MyBucket')
    

    【讨论】:

    • 您需要对延续令牌进行特殊处理,以递归地列出来自 S3 位置的对象。您提供的代码列出了存储桶中的“所有对象”,允许少于 1,000 个(来自 S3 API 的列表调用中的最大结果大小)
    • 自 2021 年 8 月 25 日起,推荐的操作是 list_objects_v2 - 其他所有操作仍然适用。
    【解决方案2】:

    你需要使用paginators:

    import boto3 
    
    client = boto3.client("s3")
    bucket = "my-bucket"
    paginator = client.get_paginator('list_objects')
    page_iterator = paginator.paginate(Bucket=bucket)
    for page in page_iterator:
        for obj in page['Contents']:
            print(f"s3://{bucket}/{obj["Key"]}")
    

    【讨论】:

    • 可能值得用list_objects_v2 修改您的评论:-) 我在一个包含超过 2m 个对象的存储桶上运行它,差异大约快 5 倍。
    【解决方案3】:

    使用更高级别的 API 并使用资源是可行的方法。

    import boto3
    
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('location2')
    bucket_files = [x.key for x in bucket.objects.all()]
    

    【讨论】:

    • 这是一个很棒的 Pythonic 解决方案,适用于最简单的用例,您有
    【解决方案4】:

    您还可以使用minio-py 客户端库,它是开源的并且与 AWS S3 兼容。

    list_objects.py 示例如下,您可以参考docs 了解更多信息。

    从 minio 导入 Minio 客户端 = Minio('s3.amazonaws.com', access_key='你的 ACCESSKEYID', secret_key='你的秘密访问密钥') # 列出bucket中所有以my-prefixname开头的对象路径。 objects = client.list_objects('my-bucketname', prefix='my-prefixname', 递归=真) 对于对象中的 obj: 打印(obj.bucket_name,obj.object_name.encode('utf-8'),obj.last_modified, obj.etag、obj.size、obj.content_type)

    希望对你有帮助。

    免责声明:我为Minio工作

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2012-02-14
      • 2012-10-03
      • 2019-12-02
      • 2010-11-21
      相关资源
      最近更新 更多