从boto3检索S3存储桶中的子文件夹名称
使用boto3,我可以访问我的AWS S3存储桶:
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
现在,存储桶包含文件夹first-
level
,例如,文件夹本身包含多个带有时间戳的子文件夹1456753904534
。我需要知道这些子文件夹的名称来完成我正在做的另一项工作,我想知道是否可以让boto3为我检索这些子文件夹。
所以我尝试了:
objs = bucket.meta.client.list_objects(Bucket='my-bucket-name')
它提供了一个字典,其键“目录”为我提供了所有第三级文件,而不是第二级时间戳目录,实际上,我得到了一个包含以下内容的列表:
{u’ETag’:’“ etag”’,u’Key’:一级/ 1456753904534 /
part-00014’,u’LastModified’:datetime.datetime(2016,2,29,13,52,24,tzinfo =
tzutc()),
u’所有者’:{u’DisplayName’:’所有者’,u’ID’:’id’},
u’Size’:大小,u’StorageClass’:’storageclass’}
您可以看到在这种情况下part-00014
已检索到特定文件,而我想单独获取目录的名称。原则上,我可以从所有路径中删除目录名称,但是在第三级检索所有内容以获得第二级是很丑陋且昂贵的!
我也尝试过这里的报道:
for o in bucket.objects.filter(Delimiter='/'):
print(o.key)
但是我没有得到所需级别的文件夹。
有办法解决吗?
-
S3是一个对象存储,它没有真实的目录结构。“
/”相当美观。人们之所以拥有目录结构是因为他们可以维护/修剪/向应用程序添加树。对于S3,您将这种结构视为索引或搜索标签的一种。要在S3中操作对象,您需要boto3.client或boto3.resource,例如,列出所有对象
import boto3 s3 = boto3.client("s3") all_objects = s3.list_objects(Bucket = 'bucket-name')
http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects
实际上,如果s3对象名称是使用’/’分隔符存储的。最新版本的list_objects(list_objects_v2)允许您将响应限制为以指定前缀开头的键。
要将项目限制为某些子文件夹下的项目:
import boto3 s3 = boto3.client("s3") response = s3.list_objects_v2( Bucket=BUCKET, Prefix ='DIR1/DIR2', MaxKeys=100 )
另一个选择是使用python os.path函数提取文件夹前缀。问题是这将需要列出不需要目录中的对象。
import os s3_key = 'first-level/1456753904534/part-00014' filename = os.path.basename(s3_key) foldername = os.path.dirname(s3_key) # if you are not using conventional delimiter like '#' s3_key = 'first-level#1456753904534#part-00014 filename = s3_key.split("#")[-1]
关于boto3的提醒:boto3.resource是一个不错的高级API。使用boto3.client与boto3.resource有优缺点。如果您开发内部共享库,则使用boto3.resource将在使用的资源上为您提供一个黑盒层。