check if a key exists in a bucket in s3 using boto3

前端 未结 24 2803
花落未央
花落未央 2020-11-28 19:03

I would like to know if a key exists in boto3. I can loop the bucket contents and check the key if it matches.

But that seems longer and an overkill. Boto3 official

相关标签:
24条回答
  • 2020-11-28 19:23
    import boto3
    client = boto3.client('s3')
    s3_key = 'Your file without bucket name e.g. abc/bcd.txt'
    bucket = 'your bucket name'
    content = client.head_object(Bucket=bucket,Key=s3_key)
        if content.get('ResponseMetadata',None) is not None:
            print "File exists - s3://%s/%s " %(bucket,s3_key) 
        else:
            print "File does not exist - s3://%s/%s " %(bucket,s3_key)
    
    0 讨论(0)
  • 2020-11-28 19:24

    Check out

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

    Check to see if a particular key exists within the bucket. This method uses a HEAD request to check for the existence of the key. Returns: An instance of a Key object or None

    from Boto S3 Docs

    You can just call bucket.get_key(keyname) and check if the returned object is None.

    0 讨论(0)
  • 2020-11-28 19:25

    Boto 2's boto.s3.key.Key object used to have an exists method that checked if the key existed on S3 by doing a HEAD request and looking at the the result, but it seems that that no longer exists. You have to do it yourself:

    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() does a HEAD request for a single key, which is fast, even if the object in question is large or you have many objects in your bucket.

    Of course, you might be checking if the object exists because you're planning on using it. If that is the case, you can just forget about the load() and do a get() or download_file() directly, then handle the error case there.

    0 讨论(0)
  • 2020-11-28 19:25

    Assuming you just want to check if a key exists (instead of quietly over-writing it), do this check first:

    import boto3
    
    def key_exists(mykey, mybucket):
      s3_client = boto3.client('s3')
      response = s3_client.list_objects_v2(Bucket=mybucket, Prefix=mykey)
      if response:
          for obj in response['Contents']:
              if mykey == obj['Key']:
                  return True
      return False
    
    if key_exists('someprefix/myfile-abc123', 'my-bucket-name'):
        print("key exists")
    else:
        print("safe to put new bucket object")
        # try:
        #     resp = s3_client.put_object(Body="Your string or file-like object",
        #                                 Bucket=mybucket,Key=mykey)
        # ...check resp success and ClientError exception for errors...
    
    0 讨论(0)
  • 2020-11-28 19:27

    I'm not a big fan of using exceptions for control flow. This is an alternative approach that works in 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")
    
    0 讨论(0)
  • 2020-11-28 19:28

    Try This simple

    import boto3
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('mybucket_name') # just Bucket name
    file_name = 'A/B/filename.txt'      # full file path
    obj = list(bucket.objects.filter(Prefix=file_name))
    if len(obj) > 0:
        print("Exists")
    else:
        print("Not Exists")
    
    0 讨论(0)
提交回复
热议问题