鉴于我有一个带有多个子文件夹(不同深度)的S3存储桶。 是否可以根据我要查找的子文件夹递归列出所有对象及其路径?
例如:
DataLake-App
App1/2020/06/21/Timestamp/
....../table_001/**.csv
....有点未知,深度可能未知
鉴于我知道表,存储桶和前缀,如果它包含表名并获取其所有内容,我是否可以搜索子文件夹?
如果是这样,在AWS中会是什么样?在过去的几个小时中,我一直在挠头。任何帮助/想法都很棒!
答案 0 :(得分:3)
boto3中的list_objects_v2()
命令将返回存储桶中的所有对象。
通过指定Prefix
,它将仅返回给定路径中的对象。
如果您希望做进一步的操作,例如只查找键名以/table_001/**.csv
结尾的对象,那么应该在Python本身中完成,例如使用endswith()
或正则表达式搜索。
请注意,list_objects_v2()
一次仅返回1000个对象,因此可能有必要使用paginator或使用ContinuationToken
的循环来返回所有所需的对象。
答案 1 :(得分:0)
您可以使用boto3的resource
功能,而无需使用分页器。
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my_bucket')
keys = 0
for obj in bucket.objects.all():
keys += 1
if keys > 10000: break
print(keys)
# 10001
使用此,
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('DataLake-App')
for obj in bucket.objects.filter(Prefix='App1/2020/06/21/Timestamp/'):
if obj.key.endswith('.csv') and obj.key.split('/')[-1] == 'table_001':
print(obj.key)
将为您提供结果。