有很多类似的问题,但我没有找到一个确切的答案。如何从初始目录开始获得所有子目录。子目录的深度未知。
假设我有:
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'])
要使它成为目录"路径"的唯一排序列表,我们将使用内联的set推导式排序。集合是唯一的,sorted会将其转换为列表。
看到https://docs.python.org/3/tutorial/datastructures.html集
import os
paths = sorted({os.path.dirname(obj['Key']) for obj in objects})