S3是一个对象商店。它不将文件/对象存储在目录树下。新来者总是混淆他们给定的“文件夹”选项,实际上这是对象的任意前缀。
object
PREFIX是一种通过预定义的修复文件名(关键字)前缀结构(例如)来组织您的对象的方法。
您可以想象使用一个不允许创建目录的文件系统,但是允许您使用斜杠“ /”或反斜杠“
”作为分隔符来创建文件名,并且可以通过以下方式表示文件的“级别”:通用前缀。
因此,在S3中,可以使用以下命令来“模拟目录”,而不是目录。
folder1-folder2-folder3-myobjectfolder1/folder2/folder3/myobjectfolder1folder2folder3myobject
如您所见,无论使用哪种类型的任意文件夹分隔符(定界符),对象名称都可以存储在S3中。
但是,为了帮助用户将批量文件传输到S3,aws cli,s3_transfer api之类的工具会尝试简化步骤并按照输入的本地文件夹结构创建对象名称。
因此,如果您确定所有S3对象都在使用
/或作为分隔符,则可以使用S3transfer或AWSCcli之类的工具通过键名进行简单下载。
这是使用资源迭代器的快速而肮脏的代码。使用s3.resource.object.filter将返回没有与list_objects()/
list_objects_v2()相同的1000个键限制的迭代器。
import os import boto3s3 = boto3.resource('s3')mybucket = s3.Bucket("mybucket")# if blank prefix is given, return everything)bucket_prefix="/some/prefix/here"objs = mybucket.objects.filter( Prefix = bucket_prefix)for obj in objs: path, filename = os.path.split(obj.key) # boto3 s3 download_file will throw exception if folder not exists try: os.makedirs(path) except FileExistsError: pass mybucket.download_file(obj.key, obj.key)


