无法从s3 aws中获取子文件夹对象

时间:2018-06-11 12:44:58

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

我正在使用此函数从S3获取数据:

 s3 = boto3.resource('s3')
    s3client = boto3.client('s3')
    Bucket = s3.Bucket('ais-django');
    obj = s3.Object('ais-django', 'Event/')


    list = s3client.list_objects_v2(Bucket='ais-django' ,Prefix='Event/' )  
    for s3_key in list:
         filename = s3_key['Key'] 

当我为Event文件夹使用前缀时(路径就像'ais-django / Event /'),它会产生如下异常输出:

{
  'IsTruncated': False,
  'Prefix': 'Event/',
  'ResponseMetadata': {
    'HTTPHeaders': {
      'date': 'Mon, 11 Jun 2018 12:42:35 GMT',
      'content-type': 'application/xml',
      'transfer-encoding': 'chunked',
      'x-amz-bucket-region': 'us-east-1',
      'x-amz-request-id': '94ADDB21361252F3',
      'server': 'AmazonS3',
      'x-amz-id-2': 'IVuVQuB2V7nClm5FaX4FRbt6brS3gAiuwpERnZxknIWoZLH65LerURwmoynKW5sv37VP6FdbYho='
    },
    'RequestId': '94ADDB21361252F3',
    'RetryAttempts': 0,
    'HostId': 'IVuVQuB2V7nClm5FaX4FRbt6brS3gAiuwpERnZxknIWoZLH65LerURwmoynKW5sv37VP6FdbYho=',
    'HTTPStatusCode': 200
  },
  'MaxKeys': 1000,
  'Name': 'ais-django',
  'KeyCount': 0
}

虽然没有前缀,但我这样添加:

list = s3client.list_objects_v2(Bucket='ais-django' )[Contents]

它提供了所有对象的列表。

那么如何才能获取特定文件夹中的所有对象?

1 个答案:

答案 0 :(得分:1)

这是你应该这样做的方式:)

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('ais-django')

for o in bucket.objects.filter(Prefix='Event/test-event'):
    print(o.key)

这是你得到的结果

result1

结果包含事件/测试事件/ ,因为AWS s3中没有文件夹系统,一切都是对象,因此事件/测试事件/ 也是如此因为事件/ test-event / image.jpg 都被视为对象。

如果你只想要内容,即图像,你可以这样做,

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('ais-django')

for o in bucket.objects.filter(Prefix='Event/test-event'):
    filename=o.key
    if filename.endswith(".jpeg") or filename.endswith(".jpg") or filename.endswith(".png"):
        print(o.key) 

现在在这种情况下我们得到事件/测试事件/ 18342087_1323920084341024_7613721308394107132_n.jpg ,因为我们正在过滤我们的结果,这是我现在唯一的图像对象

result2