我怎样才能使s3桶子图像迭代通用

时间:2018-06-07 05:34:03

标签: python amazon-web-services amazon-s3 aws-lambda amazon-rekognition

我在s3上的水桶被命名为' python'它的子文件夹是老板' 。所以我想在lambda函数中获取文件夹boss的所有图像。目前我是硬编码值,但将图像放在root中而不是在子文件夹中。

bucket="python"
key="20180530105812.jpeg"

然后我想逐个为所有图像调用此函数

def lambda_handler(event, context):
    # Get the object from the event
    bucket="ais-django"
    key="20180530105812.jpeg"

    try:

        # Calls Amazon Rekognition IndexFaces API to detect faces in S3 object 
        # to index faces into specified collection

        response = index_faces(bucket, key)

        # Commit faceId and full name object metadata to DynamoDB

3 个答案:

答案 0 :(得分:1)

在s3客户端上使用list_object操作。

bucket="python"
client=boto3.client('s3')
response = client.list_objects(
    Bucket=bucket,
    Prefix='boss'
)
numberofobjects=len(response['Contents'])
for x in range(1, numberofobjects):
    try:
        response2=index_faces(bucket, response['Contents'][x]['Key'])

答案 1 :(得分:1)

您可以在存储桶中过滤该文件夹。举个例子:

#import boto3

s3 = boto3.resource('s3')
python_bucket = s3.Bucket('python')

for images in python_bucket.objects.filter(Prefix="boss/"):
    print images.key

更新:

根据您最近的编辑,您可以遍历存储桶/文件夹并运行脚本。这是一个更完整的代码段,应该适用于您的Lambda函数:

import boto3

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    images = ""
    python_bucket = s3.Bucket('python')

    #Here, you're going through each image in your bucket/folder.
    for image in python_bucket.objects.filter(Prefix="boss/"):
        images += image.key

    return images

答案 2 :(得分:1)

这是你可以做的最好的事情,将s3事件通知添加为lambda函数的触发器,并将其配置为" boss /" 的对象前缀在你的情况下

add trigger

这里的前缀是" boss /"

prefix

然后在您的代码中更改您的存储桶并键入:

bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))

借助此功能,只要将对象上传到您的 存储桶 / boss / 路径,您的代码就会自动获取它并运行它来代码处理

这样你的lambda将不需要任何硬编码的桶和密钥字符串,并且会自动运行你的子文件夹路径中的图像上传。如果你只想处理图像,添加过滤器模式为 .jpg,.jpeg,.png等