如何使用boto3(或其他Python)列出_RequesterPays_ S3桶的内容?

s4n0splo  于 2022-12-24  发布在  Python
关注(0)|答案(3)|浏览(209)

您可以通过boto3从RequesterPays S3桶下载文件,如下所示:

s3_client.download_file('aws-naip', 'md/2013/1m/rgbir/38077/{}'.format(filename), full_path, {'RequestPayer':'requester'})

我不知道的是如何列出bucket中的对象......当我尝试调用bucket上的objects.all()时,我得到了一个身份验证错误。
如何使用boto3枚举RequesterPays bucket的内容?请注意,这是一种特殊类型的bucket,其中请求者支付S3费用。

xkrw2x1b

xkrw2x1b1#

在boto3中,我们可以看到有一个#S3.Client.list_objects方法,这个方法可以用来枚举对象:

import boto3
s3_client = boto3.client('s3')
resp = s3_client.list_objects(Bucket='RequesterPays')

# print names of all objects
for obj in resp['Contents']:
    print 'Object Name: %s' % obj['Key']

输出:

Object Name: pic.gif
Object Name: doc.txt
Object Name: page.html

如果您收到401,请确保调用API的IAM用户对存储桶具有s3:GetObject权限。

qeeaahzv

qeeaahzv2#

您必须将RequestPayer kwarg传递给list_objects方法。
另外,根据boto3的文档,
注意:ListObjectsV2是经过修订的列表对象API,我们建议您使用此经过修订的API进行新的应用程序开发
将其与分页放在一起看起来如下所示:

import boto3
s3_client = boto3.client('s3')

def get_keys(bucket, prefix, requester_pays=False):
    """Get s3 objects from a bucket/prefix
    optionally use requester-pays header
    """
    extra_kwargs = {}
    if requester_pays:
        extra_kwargs = {'RequestPayer': 'requester'}

    next_token = 'init'
    while next_token:
        kwargs = extra_kwargs.copy()
        if next_token != 'init':
            kwargs.update({'ContinuationToken': next_token})

        resp = s3_client.list_objects_v2(
            Bucket=bucket, Prefix=prefix, **kwargs)

        try:
            next_token = resp['NextContinuationToken']
        except KeyError:
            next_token = None

        for contents in resp['Contents']:
            key = contents['Key']
            yield key

可以像这样使用

x = list(get_keys('aws-naip', 'co', requester_pays=True))
s2j5cfk0

s2j5cfk03#

我有同样的问题,所以这里是代码:

import boto3

s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
    print(bucket.name)

client = boto3.client('s3')

result= client.list_objects(Bucket='bucketname',RequestPayer='requester')
for o in result['Contents']:
    print(o['Key'])

对查询的响应是一个字典,在该字典中还有另一个名为contents的字典,其中的关键字是对象的路径。您可以在以下链接中查看响应字段:列表_对象文档
注意:list_objects返回多达1000个内容,因此您必须使用next_marker属性进行迭代(如果您想要完整的列表,我会更新这个答案)。我猜您已经知道如何设置访问密钥和密钥。如果您需要更多细节,请告诉我。

相关问题