[英]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
我只想打印folder1
、 folder2
和catalog.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)
/!\ 警告
list_object
方法已修改,建議根據AWS S3 文檔使用list_objects_v2
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.