使用boto3 S3资源调用list_objects_v2报错:对象无该属性,如何解决?
修复S3遍历存储桶及对象的代码错误
报错原因
你用boto3.resource('s3')创建的是S3资源对象,它本身没有list_objects_v2方法——这个方法要么是S3客户端(client)的专属方法,要么得通过具体的Bucket实例来调用,不能直接用resource对象调用。
方案1:用S3 Resource API(更直观,推荐)
直接通过每个Bucket实例的objects.all()来获取桶内对象,修改后的代码如下:
import boto3 # 创建S3资源对象 s3_resource = boto3.resource('s3') # 遍历所有存储桶 for bucket in s3_resource.buckets.all(): print(f"存储桶名称: {bucket.name}") # 遍历当前桶里的所有对象 for obj in bucket.objects.all(): print(f"对象路径: {obj.key}")
方案2:用S3 Client API
如果习惯用客户端风格的调用,就创建client对象,同时要注意处理分页(因为list_objects_v2默认最多返回1000个对象,超过数量需要翻页获取):
import boto3 # 创建S3客户端对象 s3_client = boto3.client('s3') # 获取所有存储桶列表 buckets_response = s3_client.list_buckets() for bucket in buckets_response['Buckets']: bucket_name = bucket['Name'] print(f"存储桶名称: {bucket_name}") # 分页获取桶内对象 paginator = s3_client.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=bucket_name): if 'Contents' in page: for obj in page['Contents']: print(f"对象路径: {obj['Key']}")
关键提示
- 两种方式都需要确保你的AWS凭证配置正确(比如本地的
~/.aws/credentials文件、服务器上的IAM角色等)。 - Resource API是面向对象的写法,操作更简洁;Client API是低层级调用,灵活性更强,适合复杂场景。
内容的提问来源于stack exchange,提问作者pushpendrasingh
相关产品推荐
相关产品推荐

