首页 > 解决方案 > 使用 boto3 返回 s3 前缀中的对象列表

问题描述

我有下面的boto3代码。在代码中,我试图获取 s3 前缀中的对象列表。s3 前缀中对象的完整路径是:

文件路径:

s3://our_data/our_folder/part-00000-bf597559-8a11-4e6b-8631-ef7c138b4583-c000.txt

当我运行下面的代码时,它不会返回任何东西,但我可以发誓几个月前它有效。最近与此相关的 boto3 有什么变化,还是我的代码中遗漏了什么?

代码:

import boto3

s3_client = boto3.client('s3',
                         region_name='us-west-2')


trz_bucket = 'our_data'


trz_prefix = 'our_folder/'


result = s3_client.list_objects(Bucket=trz_bucket, Prefix=trz_prefix, Delimiter='v')

result.get('CommonPrefixes')

标签: python-3.xamazon-web-servicesamazon-s3boto3

解决方案


如果CommonPrefixes您提供Delimiter:

list_objects(Bucket=trz_bucket, Prefix=trz_prefix, Delimiter='/')

这是一个使用DelimiterCommonPrefixes使用 AWS CLI 的示例(其工作方式与使用 boto3 相同):

$ aws s3 mb s3://test-delimiter
make_bucket: test-delimiter

$ aws s3 cp x.py s3://test-delimiter/folder1/
upload: ./x.py to s3://test-delimiter/folder1/x.py                

$ aws s3 cp x.py s3://test-delimiter/folder2/
upload: ./x.py to s3://test-delimiter/folder2/x.py                

$ aws s3api list-objects --bucket test-delimiter --delimiter '/'
{
    "CommonPrefixes": [
        {
            "Prefix": "folder1/"
        },
        {
            "Prefix": "folder2/"
        }
    ]
}

$ aws s3 cp x.py s3://test-delimiter/folder1/folder3/
upload: ./x.py to s3://test-delimiter/folder1/folder3/x.py        

$ aws s3api list-objects --bucket test-delimiter --delimiter '/' --prefix folder1/
{
    "Contents": [
        {
            "Key": "folder1/x.py",
            "LastModified": "2021-06-05T07:52:35+00:00",
            "ETag": "\"1083f8ddcea96dd6b9d8a3a582373c71\"",
            "Size": 727,
            "StorageClass": "STANDARD"
            }
        }
    ],
    "CommonPrefixes": [
        {
            "Prefix": "folder1/folder3/"
        }
    ]
}

推荐阅读