首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只在第一级列出S3对象

只在第一级列出S3对象
EN

Stack Overflow用户
提问于 2022-04-01 14:41:03
回答 2查看 866关注 0票数 1

我试图列出这样的s3服从命令:

代码语言:javascript
复制
for key in s3_client.list_objects(Bucket='bucketname')['Contents']:
    logger.debug(key['Key'])

我只想打印第一层上存在的文件夹名或文件名。

例如,如果我的桶中有以下内容:

代码语言:javascript
复制
bucketname
     folder1
     folder2
        text1.txt
        text2.txt
    catallog.json

我只想打印folder1folder2catalog.json。我不想包括text1.txt等等。

但是,我的当前解决方案也会打印文件夹中的文件名。

我怎么能修改这个?我看到有一个‘前缀’参数,但不确定如何使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-01 14:57:28

您可以拆分"/“上的键,并且只保留第一个级别:

代码语言:javascript
复制
level1 = set()  #Using a set removes duplicates automatically 
for key in s3_client.list_objects(Bucket='bucketname')['Contents']:
        level1.add(key["Key"].split("/")[0])  #Here we only keep the first level of the key 

#then print your level1 set
logger.debug(level1)

/!警告

  1. list_object方法已经修订,建议根据AWS S3文档使用list_objects_v2
  2. 此方法只返回部分或全部(最多1,000)键。如果要确保获得所有键,则需要使用函数返回的continuation_token
代码语言:javascript
复制
level1 = set()
continuation_token = ""
while continuation_token is not None:
    extra_params = {"ContinuationToken": continuation_token} if continuation_token else {}
    response = s3_client.list_objects_v2(Bucket="bucketname", Prefix="", **extra_params)
    continuation_token = response.get("NextContinuationToken")
    for obj in response.get("Contents", []):
        level1.add(obj.get("Key").split("/")[0])

logger.debug(level1)
票数 3
EN

Stack Overflow用户

发布于 2022-04-01 15:15:08

您可以使用Delimiter选项,例如:

代码语言:javascript
复制
import boto3

s3 = boto3.client("s3")
BUCKET = "bucketname"

rsp = s3.list_objects_v2(Bucket=BUCKET, Delimiter="/")

objects = [obj["Key"] for obj in rsp["Contents"]]
folders = [fld["Prefix"] for fld in rsp["CommonPrefixes"]]

for obj in objects:
    print("Object:", obj)

for folder in folders:
    print("Folder:", folder)

结果:

代码语言:javascript
复制
Object: catalog.json
Folder: folder1/
Folder: folder2/

请注意,如果在顶层(超过1000个)有大量的键,则需要分页请求。

另外,请注意,对象基本上是不推荐的,您应该使用v2

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71708707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档