从boto3检索S3存储桶中的子文件夹名称

发布于 2021-01-29 18:59:21

使用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)

但是我没有得到所需级别的文件夹。

有办法解决吗?

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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将在使用的资源上为您提供一个黑盒层。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看