我可以使用boto3的过滤工具在一个桶中查找密钥(技术上的子密钥),类似于使用glob的目录中的文件吗?
我希望获得一个包含此"key/**/<pattern>/**.gz"
模式的键列表。
答案 0 :(得分:3)
不幸的是没有。 S3没有提供服务器端支持来过滤结果(除了前缀和分隔符)。
答案 1 :(得分:1)
您可以使用exrex库基于正则表达式生成所有字符串,并将其传递给boto3。这是一个简单的示例,但您可以想象一些复杂的事情:
例如:
import exrex
import boto3
session = boto3.Session() # profile_name='xyz'
s3 = session.resource('s3')
bucket = s3.Bucket('mybucketname')
prefixes = list(exrex.generate(r'api/v2/responses/2016-11-08/(2016-11-08T2[2-3]|2016-11-09)'))
objects = []
for prefix in prefixes:
print(prefix, end=" ")
current_objects = list(bucket.objects.filter(Prefix=prefix))
print(len(current_objects))
objects += current_objects
这给出了输出:
api/v2/responses/2016-11-08/2016-11-08T22 1056
api/v2/responses/2016-11-08/2016-11-08T23 1056
api/v2/responses/2016-11-08/2016-11-09 24677
答案 2 :(得分:0)
您可以通过(ab)使用分页器并使用.gz
作为分隔符来执行此操作。 Paginator将返回键的公共前缀(在这种情况下,包括.gz
文件扩展名的所有内容均不包括存储桶名称,即整个Key),您可以对这些字符串进行一些正则表达式比较。
我不是在猜测您的<pattern>
在这里,我提供的正则表达式有点粗糙且可以使用,但实际上您想要的是这个。
import boto3
import re
region = 'ap-southeast-2' ## <- YOUR REGION HERE
s3client = boto3.client('s3', region_name=region)
paginator = s3client.get_paginator('list_objects')
source_bucket = 'MY-BUCKET-NAME'
source_prefix = 'OPTIONAL-PREFIX/NESTED/'
pat = re.compile(r'key\/.+\/<pattern>\/.+.gz')
for result in paginator.paginate(Bucket=source_bucket, Prefix=source_prefix, Delimiter='.gz'):
for prefixes in result.get('CommonPrefixes'):
commonprefix = prefixes.get('Prefix')
key_path = commonprefix.split('/')
m = re.search(pat, key_path[2])
if m is not None:
print(commonprefix)