如何使用 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")

原文由 AshuGG 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

在检查 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

原文由 Sairam Krish 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进