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

我想知道一个关键是否存在于boto3中。 我可以循环桶的内容,并检查相匹配的关键。

但是,这似乎更长,而且是一个矫枉过正。 Boto3官方文档明确指出如何做到这一点。

可能是我失踪的明显。 任何人都可以指出我怎么能做到这一点。

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() ,然后在那里处理错误情况。

我不喜欢使用控制stream的exception。 这是一个在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") 

我发现的最简单的方法(也许是最有效的)是这样的:

 import boto3 from botocore.errorfactory import ClientError s3 = boto3.client('s3', aws_access_key_id='aws_key', aws_secret_access_key='aws_secret') try: s3.head_object(Bucket='bucket_name', Key='file_path') except ClientError: # Not found pass 

在Boto3中,如果您正在使用list_objects检查文件夹(前缀)或文件。 您可以在响应字典中使用“内容”的存在来检查对象是否存在。 这是另一种避免try / except捕获的方法,如@EvilPuppetMaster所示

 import boto3 client = boto3.client('s3') results = client.list_objects(Bucket='my-bucket', Prefix='dootdoot.jpg') return 'Contents' in results 

不仅client而且也是bucket

 import boto3 import botocore bucket = boto3.resource('s3', region_name='eu-west-1').Bucket('my-bucket') try: bucket.Object('my-file').get() except botocore.exceptions.ClientError as ex: if ex.response['Error']['Code'] == 'NoSuchKey': print('NoSuchKey') 

如果目录或存储桶中的数量less于1000,则可以对其进行设置,并在检查此组中是否有这样的密钥之后:

 files_in_dir = {d['Key'].split('/')[-1] for d in s3_client.list_objects_v2( Bucket='mybucket', Prefix='my/dir').get('Contents') or []} 

即使my/dir不存在,这样的代码也能正常工作。

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2

 S3_REGION="eu-central-1" bucket="mybucket1" name="objectname" import boto3 from botocore.client import Config client = boto3.client('s3',region_name=S3_REGION,config=Config(signature_version='s3v4')) list = client.list_objects_v2(Bucket=bucket,Prefix=name) for obj in list.get('Contents', []): if obj['Key'] == name: return True return False 

这是我find的最简单的技术:

 response = s3_client.list_objects_v2( Bucket=bucket_name, MaxKeys=1, Prefix=key_name ) file_exists = response['KeyCount'] > 0: 

查看

 bucket.get_key( key_name, headers=None, version_id=None, response_headers=None, validate=True ) 

检查桶中是否存在特定的密钥。 此方法使用HEAD请求来检查密钥的存在。 返回:Key对象的实例或None

来自Boto S3 Docs

您可以调用bucket.get_key(keyname)并检查返回的对象是否为None。