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



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

例如:

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

这。。。。略微未知,深度可能未知

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

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

boto3 中的list_objects_v2()命令将返回存储桶中的所有对象。

通过指定Prefix,它只会返回给定路径中的对象。

如果您希望进行进一步的操作,例如仅查找键以/table_001/**.csv结尾的对象,那么这应该在 Python 本身中完成,例如使用endswith()或正则表达式搜索。

请注意,list_objects_v2()一次只返回 1000 个对象,因此可能需要使用分页器或使用ContinuationToken的循环来返回所有需要的对象。

您可以使用不需要使用分页器的 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)

会给你结果。

最新更新