Python- Aws Boto 3从深度未知的存储桶/前缀中搜索子文件夹

时间:2020-06-20 21:40:32

标签: python-3.x amazon-web-services amazon-s3 boto3

鉴于我有一个带有多个子文件夹(不同深度)的S3存储桶。 是否可以根据我要查找的子文件夹递归列出所有对象及其路径?

例如:

  • 桶:DataLake-App
  • 前缀:App1/2020/06/21/Timestamp/
  • 其他子文件夹路径:....../table_001/**.csv

....有点未知,深度可能未知

鉴于我知道表,存储桶和前缀,如果它包含表名并获取其所有内容,我是否可以搜索子文件夹?

如果是这样,在AWS中会是什么样?在过去的几个小时中,我一直在挠头。任何帮助/想法都很棒!

2 个答案:

答案 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)

将为您提供结果。