我想知道boto3中是否存在密钥。我可以循环存储桶中的内容,并检查密钥是否匹配。
但这似乎更长,而且有点过头了。Boto3官方文档明确说明了如何做到这一点。
也许我漏掉了显而易见的东西。有谁能告诉我怎样才能做到这一点。
发布于 2015-11-21 19:53:55
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()
,然后在那里处理错误情况。
发布于 2016-07-14 22:00:56
我发现的最简单(也可能是最有效)的方法是:
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
发布于 2016-01-02 10:53:50
我不太喜欢在控制流中使用异常。这是在boto3中工作的另一种方法:
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")
https://stackoverflow.com/questions/33842944
复制相似问题