调用boto3 S3.Bucket时报错'S3' object has no attribute 'Bucket'如何解决
问题原因
你使用boto3.client('s3')创建的是低阶S3客户端对象,该类没有Bucket属性,这是接口类型不匹配导致的报错,和大小写无关。
boto3提供两类S3操作接口:
- 低阶client接口:直接映射S3原生API,所有方法都是和API一一对应的调用形式,不存在封装好的Bucket实例对象
- 高阶resource接口:封装了面向对象的操作逻辑,可以直接调用
Bucket()方法实例化桶对象,再调用对应的实例方法
解决方案
有两种适配方案可选:
方案1:改用resource接口,适配现有后续操作逻辑
如果要保留firstbucket.upload_fileobj的写法,把s3实例的创建方式改成resource即可,list_objects方法可以通过resource绑定的client调用:
import boto3 s3_file_path = "testunzipping/sample.csv.gz" # 替换client为resource s3 = boto3.resource('s3') # 通过meta.client调用原client的list_objects方法 lst = s3.meta.client.list_objects(Bucket='testunzipping')['Contents'] firstbucket = s3.Bucket('testunzipping') # 后续上传逻辑无需修改 firstbucket.upload_fileobj(destination_file_gz, s3_filename)
方案2:继续使用client接口,调整上传写法
如果不想修改原有s3实例的创建逻辑,直接用client自带的upload_fileobj方法即可,不需要实例化Bucket对象:
import boto3 s3_file_path = "testunzipping/sample.csv.gz" s3 = boto3.client('s3') lst = s3.list_objects(Bucket='testunzipping')['Contents'] # 直接调用client的上传方法,参数依次为:文件对象、桶名、S3对象路径 s3.upload_fileobj(destination_file_gz, 'testunzipping', s3_filename)
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

