当前位置: 首页 > 面试题库 >

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

常乐
2023-03-14
问题内容

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



 类似资料:
  • 使用boto3,我可以访问我的AWS S3桶: 您可以看到,检索了特定的文件,在本例中是,而我只想获取目录的名称。原则上,我可以从所有路径中删除目录名,但在第三级检索所有内容以获得第二级是丑陋和昂贵的! 我也尝试了这里报道的一些东西: 但是我没有得到所需级别的文件夹。

  • 问题内容: 我有一个s3结构,如下所示: 我需要做的就是给定s3bucket的名称和一个第一级密钥的条目,我需要位于第一级密钥下的所有第二级密钥的名称。因此,从本质上来说,如果我们将其视为一个文件夹,则将获得的名称(即)和其子文件夹之一的名称,我想列出其中的所有文件夹。虽然只是名称,而不是完整的路径。 有人可以指出如何使用亚马逊的Java SDK在Java中做到这一点吗? 谢谢 问题答案: 我做了

  • 问题内容: 我这样做是读取了S3存储桶中的文件名 现在,我需要获取文件的实际内容,类似于。什么是最好的方法? 问题答案: boto3提供了一种资源模型,该资源模型使诸如迭代对象之类的任务变得更加容易。不幸的是,StreamingBody不提供或。

  • 使用Boto3,python脚本从S3桶中下载文件以读取它们,并将下载文件的内容写入名为的文件。 我的问题是,一旦脚本使用AWS Lambda函数,它将如何以相同的方式工作?

  • 有没有一种方法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS帐户中。我可以使用aws cli命令一次复制一个文件: 然而,我有1000份文件要复制。我不想复制源存储桶中的所有文件,因此无法使用sync命令。有没有一种方法可以用需要复制的文件名列表来调用一个文件,从而自动化这个过程?

  • 每个上传类别有多个s3桶,还是一个带子文件夹的桶,还是一个链接的s3桶更好?我确信用户图像会比剖析图片多,每个桶有5TB的限制,每个账户有100个桶。我正在使用aws boto库和https://github.com/amol-/depot 我的文件夹的结构是以下哪种方式? 最后一个意味着它实际上是一个10TB的存储桶,当bucket_1中的文件超过5TB时,就会创建一个新的存储桶。但所有上传的内