使用 boto3 检查 s3 中的存储桶中是否存在密钥

新手上路,请多包涵

我想知道 boto3 中是否存在密钥。我可以循环存储桶内容并检查密钥是否匹配。

但这似乎更长,而且有点矫枉过正。 Boto3 官方文档明确说明了如何执行此操作。

可能是我错过了显而易见的事情。谁能指出我如何实现这一目标。

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

阅读 260
2 个回答

Boto 2 的 boto.s3.key.Key 对象曾经有一个 exists 通过执行 HEAD 请求并查看结果来检查密钥是否存在于 S3 上的方法,但似乎不再存在.你必须自己做:

 import boto3
import botocore

s3 = boto3.resource('s3')

try:
    s3.Object('my-bucket', 'dootdoot.jpg').load()
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == "404":
        # The object does not exist.
        ...
    else:
        # Something else has gone wrong.
        raise
else:
    # The object does exist.
    ...

load() 对单个键执行 HEAD 请求,即使所讨论的对象很大或者您的存储桶中有很多对象,它也很快。

当然,您可能正在检查该对象是否存在,因为您正计划使用它。如果是这种情况,您可以忘记 load() 并执行 get()download_file() 直接处理错误情况。

原文由 Wander Nauta 发布,翻译遵循 CC BY-SA 3.0 许可协议

我找到的最简单的方法(可能也是最有效的)是这样的:

 import boto3
from botocore.errorfactory import ClientError

s3 = boto3.client('s3')
try:
    s3.head_object(Bucket='bucket_name', Key='file_path')
except ClientError:
    # Not found
    pass

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

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