鉴于我有一个包含多个子文件夹(具有不同深度(的 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)
会给你结果。