S3 boto3 仅列出目录

S3 boto3 list directories only

我在 S3 中有以下层次结构,我只想检索子文件夹类型信息,不包括以 .txt 结尾的文件(基本上排除文件名并仅检索 prefixes/folders)。

--folder1/subfolder1/item1.txt
--folder1/subfolder1/item11.txt
--folder1/subfolder2/item2.txt
--folder1/subfolder2/item21.txt
--folder1/subfolder3/item3.txt
--folder1/subfolder3/subfolder31/item311.txt 

期望的输出:

--folder1/subfolder1
--folder1/subfolder2
--folder1/subfolder3/subfolder31

我知道S3里面没有folders/subfolders但是都是key

我试过下面的代码,但它显示了所有信息,包括像 item1.txt

这样的文件名
s3 = boto3.resource('s3')
client = boto3.client('s3')
bucket = s3.Bucket('s3-bucketname')
paginator = client.get_paginator('list_objects')


objs = list(bucket.objects.filter(Prefix='folder1/'))
for i in range(0, len(objs)):
    print(objs[i].key)

任何低于输出的建议?

--folder1/subfolder1
--folder1/subfolder2
--folder1/subfolder3/subfolder31

正如你所说,S3 并没有真正的文件夹概念,所以为了得到你想要的,在某种意义上,你需要重新创建它。

一个选项是列出存储桶中的所有对象,构建每个对象的文件夹或前缀,并在 运行 对它们进行操作时对新名称进行操作:

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('s3-bucketname')
shown = set()
for obj in bucket.objects.filter(Prefix='folder1/'):
    prefix = "/".join(obj.key.split("/")[:-1])
    if len(prefix) and prefix not in shown:
        shown.add(prefix)
        print(prefix + "/")