在boto3中过滤类似于glob的正则表达式模式

时间:2016-02-16 20:30:00

标签: glob boto3

我可以使用boto3的过滤工具在一个桶中查找密钥(技术上的子密钥),类似于使用glob的目录中的文件吗?

我希望获得一个包含此"key/**/<pattern>/**.gz"模式的键列表。

3 个答案:

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