如何获取AWS S3中的所有子目录、所有级别(使用python boto3的文件除外)

问题描述

有很多类似的问题,但我在这个问题上找不到确切的答案。如何从初始目录开始获取所有子目录。子目录的深度未知。

假设我有:

data/subdir1/subdir2/file.csv
data/subdir1/subdir3/subdir4/subdir5/file2.csv
data/subdir6/subdir7/subdir8/file3.csv

因此,我希望获得所有长度的子目录的列表,或者更好的方式是获得文件之前的所有路径。在我的示例中,理想情况下我希望获得:

data/subdir1/subdir2/
data/subdir1/subdir3/subdir4/subdir5/
data/subdir6/subdir7/subdir8/

但我也可以使用这个:

data/subdir1/
data/subdir1/subdir2/
data/subdir1/subdir3/
data/subdir1/subdir3/subdir4/
etc...
data/subdir6/subdir7/subdir8/

到目前为止,我的代码只获得了一个级别的目录:

result = await self.s3_client.list_objects(
    Bucket=bucket, Prefix=prefix, Delimiter="/"
)

subfolders = set()
for content in result.get("CommonPrefixes"):
    print(f"sub folder : {content.get('Prefix')}")
    subfolders.add(content.get("Prefix"))

return subfolders

解决方案

import os

# list_objects returns a dictionary. The 'Contents' key contains a
# list of full paths including the file name stored in the bucket
# for example: data/subdir1/subdir3/subdir4/subdir5/file2.csv
objects = s3_client.list_objects(Bucket='bucket_name')['Contents']

# here we iterate over the fullpaths and using 
# os.path.dirname we get the fullpath excluding the filename
for obj in objects:
    print(os.path.dirname(obj['Key'])

要使其成为目录&路径和路径的唯一排序列表,我们将使用Sort a set complementation inline。集是唯一的,排序后会将其转换为列表。

参见https://docs.python.org/3/tutorial/datastructures.html#sets

import os
paths = sorted({os.path.dirname(obj['Key']) for obj in objects})

相关文章