Boto3如何仅使用S3 resource而非client操作S3存储桶
解答
仅使用S3 Resource完成所有操作完全可行,你想通过绑定桶实例完成所有操作的思路是合理的,根本不需要额外单独创建S3 Client。
先纠正两个容易踩的误区:
- 你提到的
bucket.new_key()是旧版boto2的接口,boto3里已经删掉了这个方法,不用找对应的实现 - boto3的S3 Resource本身就是对底层Client的高层封装,你初始化Resource的时候,内部已经自动生成了对应的底层Client,不需要你手动重复声明。所有S3操作都可以通过Resource实例、以及Resource派生的Bucket/Object等子实例完成,完全不需要额外操作底层Client。
你贴的代码里有个笔误:创建s3r的那行末尾多打了OB两个字符,直接跑会报语法错,删掉就行。
你之前用Client调用put_object创建目录占位对象的逻辑,直接在Bucket实例上就能调同名方法实现,而且不用重复传Bucket参数——毕竟Bucket实例已经和指定桶绑定了。
纯Resource实现的可运行代码
import boto3 bucket_name = 'my-bucket-name' region_name = 'my-region-name' print('Acquiring s3 service') # 只初始化S3 Resource即可,不需要单独创建Client s3r = boto3.resource('s3', region_name=region_name) print('Accessing bucket') bucket = s3r.Bucket(bucket_name) print('Emptying bucket') bucket.objects.all().delete() print('Uploading folder structures') # 直接通过绑定好的Bucket实例调用方法 bucket.put_object(Key='testdir/') bucket.put_object(Key='testdir/subdir1/') bucket.put_object(Key='testdir/subdir2/')
补充说明
- 上面的代码和你原来Client版本的运行效果完全一致,全程没有用到单独声明的Client实例
- 后续不管是上传下载文件、修改对象权限、列举对象这类操作,都可以直接在Bucket实例、或者
bucket.Object(你的对象key)生成的对象实例上调用对应方法完成,不需要切回Client - 顺带提一句:S3本身是扁平化的对象存储,没有原生文件系统的目录概念。你创建的以
/结尾的0字节对象,只是用来让S3控制台显示对应“文件夹”的占位符,就算不提前建这个占位符,直接上传testdir/a.txt这类带前缀的对象,控制台也会自动按层级显示目录结构。
内容的提问来源于stack exchange,提问作者Frank Harris
相关产品推荐
相关产品推荐

