AWS Rekognition和s3调用Python Lambda中的子文件夹

问题描述 投票:1回答:3

我无法弄清楚如何使用Python在s3中访问存储桶中的某个文件夹

假设我正在尝试访问存储桶中的这个文件夹,其中包含一堆我想要运行的图像:“myBucket / subfolder / images /”

在/ images /文件夹中有:

one.jpg  
two.jpg  
three.jpg  
four.jpg  

我想在这个文件夹上运行rekognition的detect_labels。但是,我似乎无法访问此文件夹,但如果我将bucket_name更改为只是根文件夹(“myBucket”/),那么我只能访问该文件夹。

bucket_name = "myBucket/subfolder/images/"  
rekognition = boto3.client('rekognition')  
s3 = boto3.resource('s3')  
bucket = s3.Bucket(name=bucket_name)  
python amazon-web-services amazon-s3 aws-lambda aws-cli
3个回答
0
投票

这是按预期运作的。存储桶名称应该只是存储桶的名称。

然后,您可以在存储桶上运行操作,例如:

import boto3

s3 = boto3.resource('s3', region_name='ap-southeast-2')
bucket = s3.Bucket('my-bucket')

for object in bucket.objects.all():
    if object.key.startswith('images'):
        print object.key

或者,使用client而不是resource

import boto3

client = boto3.client('s3', region_name='ap-southeast-2')
response = client.list_objects_v2(Bucket='my-bucket', Prefix='images/')

for object in response['Contents']:
    print object['Key']

0
投票

您可以在其他地方索引您在S3中拥有的内容,这样您就可以直接访问所需内容。请记住,循环存储在存储桶中的文件可能会提供非常低的性能,如果您拥有的密钥数量很大,它会变得非常慢。

按照你的例子,另一种方法:

bucket_name = "myBucket"  
folder_name = "subfolder/images/"  
rekognition = boto3.client('rekognition')

keys= ['one.jpg','two.jpg','three.jpg','four.jpg']
s3 = boto3.resource('s3')  
for k in keys:
  obj = s3.Object(bucket_name, folder_name+k )
  print(obj.key)

从系统中的任何db表中获取项目列表(keys)。


0
投票

对于AWS Rekognition(如要求),存储在S3存储桶中的文件夹中的图像文件将具有folder_name/subfolder_name/image_name.jpg形式的密钥。所以,因为boto3 Rekognition detect_labels()方法有这种语法(每https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rekognition.html#Rekognition.Client.detect_labels):

response = client.detect_labels(
    Image={
        'Bytes': b'bytes',
        'S3Object': {
            'Bucket': 'string',
            'Name': 'string',
            'Version': 'string'
        }
    },
    MaxLabels=123,
    MinConfidence=...
)

其中Name的值应该是S3对象键名,您可以将整个文件夹图像路径作为字符串提供给该字典。要循环多个图像,按照Evhz的答案中的建议生成图像文件名列表,并在调用上面的detect_labels()方法时循环该列表(或使用生成器)。

© www.soinside.com 2019 - 2024. All rights reserved.