首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用boto3检查s3的存储桶中是否存在密钥

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

Stack Overflow用户
提问于 2015-11-21 19:46:03
回答 21查看 233.1K关注 0票数 250

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

但这似乎更长,而且有点过头了。Boto3官方文档明确说明了如何做到这一点。

也许我漏掉了显而易见的东西。有谁能告诉我怎样才能做到这一点。

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2015-11-21 19:53:55

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

代码语言:javascript
复制
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(),然后在那里处理错误情况。

票数 262
EN

Stack Overflow用户

发布于 2016-07-14 22:00:56

我发现的最简单(也可能是最有效)的方法是:

代码语言:javascript
复制
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
票数 168
EN

Stack Overflow用户

发布于 2016-01-02 10:53:50

我不太喜欢在控制流中使用异常。这是在boto3中工作的另一种方法:

代码语言:javascript
复制
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if any([w.key == path_s3 for w in objs]):
    print("Exists!")
else:
    print("Doesn't exist")
票数 164
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33842944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档