代码之家  ›  专栏  ›  技术社区  ›  Pro-Web

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

  •  0
  • Pro-Web  · 技术社区  · 7 年前

    我使用此函数从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'] 
    

    当我使用事件文件夹的前缀(路径就像“AIS Django/Evs/”)时,它会给出这样的异常输出:

    {
      '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 回复  |  直到 7 年前
        1
  •  1
  •   Mausam Sharma    7 年前

    你应该这样做:)

    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中没有文件夹系统,所以所有内容都是一个对象,因此 事件/测试事件/ 以及 事件/测试事件/图像.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