簡體   English   中英

列出 S3 對象直到第一級

[英]list S3 objects till only first level

我正在嘗試像這樣列出 s3 obejcts:

for key in s3_client.list_objects(Bucket='bucketname')['Contents']:
    logger.debug(key['Key'])

我只想打印第一層上存在的文件夾名稱或文件名稱。

例如,如果我的桶有這個:

bucketname
     folder1
     folder2
        text1.txt
        text2.txt
    catallog.json

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

但是,我當前的解決方案還會打印存儲桶名稱中文件夾中存在的文件名。

我該如何修改? 我看到有一個“前綴”參數,但不確定如何使用它。

您可以在“/”上拆分鍵,只保留第一級:

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 個)鍵。 如果要確保獲得所有密鑰,則需要使用 function 返回的continuation_token
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)

您使用Delimiter選項,例如:

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)

結果:

Object: catalog.json
Folder: folder1/
Folder: folder2/

請注意,如果您的頂層有大量鍵(超過 1000 個),那么您將需要對您的請求進行分頁

另外,請注意list_objects基本上已棄用,您應該使用list_objects_v2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM