首页 > 解决方案 > 如何使用 python 和 boto3 检查 S3 存储桶中是否存在特定目录

问题描述

如何检查特定文件是否存在于我的 S3 的特定目录中?我使用 Boto3 并尝试了这段代码(不起作用):

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if len(objs) > 0 and objs[0].key == key:
    print("Exists!")
else:
    print("Doesn't exist")

标签: python-3.xamazon-s3boto3

解决方案


在检查 S3 文件夹时,有两种情况:

方案 1

import boto3

def folder_exists_and_not_empty(bucket:str, path:str) -> bool:
    '''
    Folder should exists. 
    Folder should not be empty.
    '''
    s3 = boto3.client('s3')
    if not path.endswith('/'):
        path = path+'/' 
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/',MaxKeys=1)
    return 'Contents' in resp
  • 上面的代码使用MaxKeys=1. 这样效率更高。即使该文件夹包含大量文件,它也会快速回复其中一个内容。
  • 观察它检查Contents响应

方案 2

import boto3

def folder_exists(bucket:str, path:str) -> bool:
    '''
    Folder should exists. 
    Folder could be empty.
    '''
    s3 = boto3.client('s3')
    path = path.rstrip('/') 
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/',MaxKeys=1)
    return 'CommonPrefixes' in resp
  • 观察它从路径中剥离最后/一条。此前缀将仅检查该文件夹,而不检查该文件夹。
  • 观察它检查CommonPrefixes响应而不是Contents

推荐阅读