ตรวจสอบว่ามีกุญแจอยู่ในที่ฝากข้อมูลใน s3 โดยใช้ boto3


165

ฉันต้องการทราบว่ามีรหัสใน boto3 หรือไม่ ฉันสามารถวนเนื้อหาที่ฝากข้อมูลและตรวจสอบคีย์ถ้าตรงกัน

แต่ดูเหมือนว่านานกว่าและเกินเลยไป เอกสารอย่างเป็นทางการของ Boto3 ระบุวิธีการทำเช่นนี้อย่างชัดเจน

ฉันอาจจะหายไปอย่างชัดเจน ใครช่วยชี้ให้ฉันดูว่าฉันสามารถบรรลุสิ่งนี้ได้อย่างไร

คำตอบ:


196

boto.s3.key.Keyวัตถุของ Boto 2 เคยใช้existsวิธีการตรวจสอบว่ามีกุญแจอยู่บน S3 โดยทำการร้องขอ HEAD และดูผลลัพธ์ แต่ดูเหมือนว่าไม่มีอยู่อีกต่อไป คุณต้องทำมันเอง:

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()โดยตรงจากนั้นจัดการกรณีข้อผิดพลาดที่นั่น


ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว ฉันต้องการแบบเดียวกันสำหรับ boto3
Prabhakar Shanmugam

12
สำหรับboto3ดูเหมือนว่าดีที่สุดที่คุณสามารถทำได้ในขณะนี้คือการโทรhead_objectเพื่อลองและดึงข้อมูลเมตาสำหรับคีย์จากนั้นจัดการกับข้อผิดพลาดที่เกิดขึ้นหากไม่มีอยู่
Wander Nauta

1
@ Leonid แน่นอนคุณสามารถ แต่ถ้าคุณห่อนี้ในฟังก์ชั่นหรือวิธีการซึ่งขึ้นอยู่กับคุณ ฉันได้แก้ไขโค้ดตัวอย่างเล็กน้อยเพื่อให้existsบูลีนหายไปและชัดเจนขึ้น (ฉันหวังว่า!) ผู้คนควรปรับตัวเข้ากับสถานการณ์ของพวกเขา
Wander Nauta

2
-1; ไม่ได้ผลสำหรับฉัน กับรุ่น boto3 1.5.26 ผมเห็นe.response['Error']['Code']มีค่าเหมือนไม่"NoSuchKey" "404"ฉันไม่ได้ตรวจสอบว่าเป็นเพราะความแตกต่างในเวอร์ชันไลบรารี่หรือการเปลี่ยนแปลงใน API ของตัวเองตั้งแต่เขียนคำตอบนี้ ไม่ว่าจะด้วยวิธีใดในรุ่น boto3 ของฉันวิธีที่สั้นกว่าการตรวจสอบe.response['Error']['Code']คือจับเฉพาะs3.meta.client.exceptions.NoSuchKeyในตอนแรกเท่านั้น
Mark Amery

2
หากคุณใช้ s3 client(ตรงข้ามกับ a resource) ให้ทำs3.head_object(Bucket='my_bucket', Key='my_key')แทนs3.Object(...).load()
user2426679

127

ฉันไม่ใช่แฟนตัวยงของการใช้ข้อยกเว้นสำหรับโฟลว์การควบคุม นี่เป็นวิธีทางเลือกที่ใช้งานได้ใน 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")

ขอบคุณสำหรับการอัปเดต EvilPuppetMaster น่าเสียดายเมื่อฉันตรวจสอบครั้งล่าสุดฉันไม่มีสิทธิ์การเข้าถึงที่เก็บรายการ คำตอบของคุณเหมาะสำหรับคำถามของฉันดังนั้นฉันจึงโหวตให้คุณ แต่ฉันได้ทำเครื่องหมายคำตอบแรกไว้เป็นคำตอบนานแล้ว ขอบคุณสำหรับความช่วยเหลือของคุณ.
Prabhakar Shanmugam

27
สิ่งนี้ไม่นับเป็นคำขอรายชื่อ (แพงกว่า 12.5 เท่า) ถ้าคุณทำสิ่งนี้กับวัตถุ 100 ล้านชิ้นนั่นอาจจะแพงไปหน่อย ... ฉันมีความรู้สึกว่าวิธีการจับยกเว้นนั้นน่าเสียดายที่ดีที่สุด
Pierre D

21
รายการอาจมีราคาแพงเพียง 12.5x ต่อคำขอ แต่คำขอเดียวยังสามารถส่งคืนวัตถุได้ 100 ล้านรายการโดยที่การเรียกเพียงครั้งเดียวสามารถส่งคืนได้เพียงครั้งเดียว ดังนั้นในกรณีสมมุติของคุณมันจะถูกกว่าที่จะเรียกรายชื่อทั้งหมด 100 ล้านรายการแล้วเปรียบเทียบกับในท้องถิ่น ไม่ต้องพูดถึง 1,000x เร็วกว่าเนื่องจากคุณไม่ต้องการ http round trip สำหรับทุกวัตถุ
EvilPuppetMaster

มันไม่ทำงานเมื่อไฟล์ของฉันอยู่ในโฟลเดอร์ภายในที่ฝากข้อมูล s3
user3186866

2
@ user3186866 นั่นเป็นเพราะ S3 ไม่มี "โฟลเดอร์" วัตถุทั้งหมดมีอยู่เป็นไฟล์ที่เส้นทางที่กำหนด โฟลเดอร์เป็นเครื่องมือที่ช่วยให้เราสามารถจัดระเบียบและเข้าใจโครงสร้างของที่เก็บข้อมูลของเราได้ แต่ในความเป็นจริง S3 buckets เป็นเพียงที่เก็บข้อมูล
ibtokin

114

วิธีที่ง่ายที่สุดที่ฉันพบ (และอาจมีประสิทธิภาพมากที่สุด) คือ:

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

2
หมายเหตุ: คุณไม่ต้องผ่าน aws_access_key_id / aws_secret_access_key เป็นต้นหากใช้บทบาทหรือคุณมีกุญแจในตัวคุณ. Haw config คุณสามารถทำได้s3 = boto3.client('s3')
Andy Hayden

20
ฉันคิดว่าการเพิ่มการทดสอบนี้ช่วยให้คุณมั่นใจมากขึ้นว่าวัตถุไม่มีอยู่จริงแทนที่จะเป็นข้อผิดพลาดอื่น ๆ ที่ทำให้เกิดข้อยกเว้น - โปรดทราบว่า 'e' เป็นตัวอย่างของข้อยกเว้น ClientError:if e.response['ResponseMetadata']['HTTPStatusCode'] == 404:
Richard

@AndyHayden สิ่งที่แต่ละคนจะลองพิจารณาในแง่ของค่าใช้จ่าย aws?
วนรอบ

2
@Taylor เป็นคำขอ แต่ไม่มีการถ่ายโอนข้อมูล
Andy Hayden

1
ClientError เป็นตัวจับทั้งหมดสำหรับ 400 ไม่ใช่แค่ 404 ดังนั้นมันจึงไม่แข็งแกร่ง
mickzer

21

ใน Boto3 หากคุณกำลังตรวจสอบโฟลเดอร์ (คำนำหน้า) หรือไฟล์โดยใช้ list_objects คุณสามารถใช้การดำรงอยู่ของ 'เนื้อหา' ใน dict การตอบสนองเป็นการตรวจสอบว่าวัตถุมีอยู่ เป็นอีกวิธีหนึ่งในการหลีกเลี่ยงการลอง / ยกเว้นการจับตามที่ @EvilPuppetMaster แนะนำ

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

2
มีปัญหาในการนี้ list_objects ("2000") จะส่งคืนคีย์เช่น "2000-01", "2000-02"
Gunnar Cheng

3
ส่งคืนวัตถุได้สูงสุด 1,000 รายการเท่านั้น! boto3.amazonaws.com/v1/documentation/api/latest/reference/…
RoachLord

นี่เป็นโซลูชันที่มีประสิทธิภาพที่สุดเนื่องจากไม่ต้องการการs3:GetObjectอนุญาตเพียงs3:ListBucketสิทธิ์
Vishrant

11

ไม่เพียง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')

3
คุณอาจไม่ต้องการรับวัตถุ แต่เพียงแค่ดูว่ามันมี คุณสามารถใช้วิธีการที่หัววัตถุเช่นตัวอย่างอื่น ๆ bucket.Object(key).last_modifiedที่นี่เช่น
ryanjdillon

10

คุณสามารถใช้S3Fซึ่งเป็นตัวห่อหุ้มรอบ boto3 ที่แสดงการดำเนินงานสไตล์ระบบไฟล์โดยทั่วไป:

import s3fs
s3 = s3fs.S3FileSystem()
s3.exists('myfile.txt')

แม้ว่าฉันจะคิดว่ามันใช้งานได้ แต่คำถามก็ถามเกี่ยวกับวิธีทำกับ boto3 ในกรณีนี้มันเป็นจริงในการแก้ปัญหาโดยไม่ต้องติดตั้งห้องสมุดเพิ่มเติม
paulkernfeld

5
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)

5

FWIW นี่คือฟังก์ชั่นที่ง่ายมากที่ฉันใช้

import boto3

def get_resource(config: dict={}):
    """Loads the s3 resource.

    Expects AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to be in the environment
    or in a config dictionary.
    Looks in the environment first."""

    s3 = boto3.resource('s3',
                        aws_access_key_id=os.environ.get(
                            "AWS_ACCESS_KEY_ID", config.get("AWS_ACCESS_KEY_ID")),
                        aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY", config.get("AWS_SECRET_ACCESS_KEY")))
    return s3


def get_bucket(s3, s3_uri: str):
    """Get the bucket from the resource.
    A thin wrapper, use with caution.

    Example usage:

    >> bucket = get_bucket(get_resource(), s3_uri_prod)"""
    return s3.Bucket(s3_uri)


def isfile_s3(bucket, key: str) -> bool:
    """Returns T/F whether the file exists."""
    objs = list(bucket.objects.filter(Prefix=key))
    return len(objs) == 1 and objs[0].key == key


def isdir_s3(bucket, key: str) -> bool:
    """Returns T/F whether the directory exists."""
    objs = list(bucket.objects.filter(Prefix=key))
    return len(objs) > 1

1
นี่คือการตอบสนองเดียวที่ฉันเห็นว่าการตรวจสอบที่อยู่สำหรับ 'โฟลเดอร์' เมื่อเทียบกับ 'ไฟล์' ที่มีความสำคัญอย่างยิ่งสำหรับรูทีนที่จำเป็นต้องรู้ว่ามีโฟลเดอร์ใดโฟลเดอร์หนึ่งอยู่หรือไม่ไม่ใช่ไฟล์เฉพาะในโฟลเดอร์
แคมป์เบล

ขณะนี้เป็นคำตอบที่ระมัดระวังจะมีประโยชน์เฉพาะเมื่อผู้ใช้เข้าใจว่าความคิดของโฟลเดอร์ทำให้เข้าใจผิดในกรณีนี้ ว่างเปล่า 'โฟลเดอร์' สามารถมีอยู่ใน S3 ในที่เก็บข้อมูลและถ้าเป็นเช่นนั้น isdir_s3 จะคืนค่า False ใช้เวลาสองสามนาทีในการเรียงลำดับนั้นฉันกำลังคิดถึงการแก้ไขคำตอบราวกับว่านิพจน์เปลี่ยนเป็น> 0 คุณจะได้รับ ผลที่คุณคาดหวัง
PyNEwbie

5

สมมติว่าคุณต้องการตรวจสอบว่ามีกุญแจอยู่หรือไม่ (แทนที่จะเขียนทับมันอย่างเงียบ ๆ ) ให้ทำการตรวจสอบนี้ก่อน:

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...

4

สิ่งนี้สามารถตรวจสอบทั้งคำนำหน้าและคีย์และดึงได้ไม่เกิน 1 คีย์

def prefix_exits(bucket, prefix):
    s3_client = boto3.client('s3')
    res = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=1)
    return 'Contents' in res

3

ลองง่าย ๆ

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")

1

หากคุณมีน้อยกว่า 1,000 ในไดเรคทอรีหรือที่ฝากข้อมูลคุณสามารถรับชุดของพวกเขาและหลังจากตรวจสอบว่าคีย์ดังกล่าวในชุดนี้:

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


1
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

1

สำหรับ boto3 สามารถใช้ObjectSummaryเพื่อตรวจสอบว่ามีวัตถุอยู่หรือไม่

มีข้อมูลสรุปของวัตถุที่เก็บอยู่ในที่ฝากข้อมูล Amazon S3 วัตถุนี้ไม่ได้มีข้อมูลเมตาแบบเต็มของวัตถุหรือเนื้อหาใด ๆ ของมัน

import boto3
from botocore.errorfactory import ClientError
def path_exists(path, bucket_name):
    """Check to see if an object exists on S3"""
    s3 = boto3.resource('s3')
    try:
        s3.ObjectSummary(bucket_name=bucket_name, key=path).load()
    except ClientError as e:
        if e.response['Error']['Code'] == "404":
            return False
        else:
            raise e
    return True

path_exists('path/to/file.html')

ในObjectSummary.load

โทร s3.Client.head_object เพื่ออัพเดตคุณสมบัติของทรัพยากร ObjectSummary

นี้แสดงให้เห็นว่าคุณสามารถใช้ObjectSummaryแทนถ้าคุณกำลังวางแผนในการไม่ได้ใช้Object ฟังก์ชั่นไม่เรียกวัตถุที่มันได้รับการสรุปget()load()


1

นี่คือทางออกที่เหมาะกับฉัน ข้อแม้หนึ่งคือฉันรู้รูปแบบที่แน่นอนของคีย์ล่วงหน้าดังนั้นฉันจึงแสดงรายการไฟล์เดียว

import boto3

# The s3 base class to interact with S3
class S3(object):
  def __init__(self):
    self.s3_client = boto3.client('s3')

  def check_if_object_exists(self, s3_bucket, s3_key):
    response = self.s3_client.list_objects(
      Bucket = s3_bucket,
      Prefix = s3_key
      )
    if 'ETag' in str(response):
      return True
    else:
      return False

if __name__ == '__main__':
  s3  = S3()
  if s3.check_if_object_exists(bucket, key):
    print "Found S3 object."
  else:
    print "No object found."

1

คุณสามารถใช้ Boto3 สำหรับสิ่งนี้

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
objs = list(bucket.objects.filter(Prefix=key))
if(len(objs)>0):
    print("key exists!!")
else:
    print("key doesn't exist!")

ที่นี่สำคัญคือเส้นทางที่คุณต้องการตรวจสอบว่ามีอยู่หรือไม่


จากการ%timeitทดสอบอย่างง่ายนี้ดูเหมือนว่าเป็นทางเลือกที่เร็วที่สุด
Itamar Katz

1

มันง่ายมากด้วยget()วิธีการ

import botocore
from boto3.session import Session
session = Session(aws_access_key_id='AWS_ACCESS_KEY',
                aws_secret_access_key='AWS_SECRET_ACCESS_KEY')
s3 = session.resource('s3')
bucket_s3 = s3.Bucket('bucket_name')

def not_exist(file_key):
    try:
        file_details = bucket_s3.Object(file_key).get()
        # print(file_details) # This line prints the file details
        return False
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "NoSuchKey": # or you can check with e.reponse['HTTPStatusCode'] == '404'
            return True
        return False # For any other error it's hard to determine whether it exists or not. so based on the requirement feel free to change it to True/ False / raise Exception

print(not_exist('hello_world.txt')) 

ไม่แข็งแกร่งยกเว้นจะถูกโยนด้วยเหตุผลหลายประการเช่น HTTP 500 และรหัสนี้จะถือว่า 404
mickzer

แต่เราต้องการข้อมูลเกี่ยวกับไม่ว่าไฟล์นั้นจะสามารถเข้าถึงได้หรือไม่ มันมีอยู่และไม่สามารถเข้าถึงได้จากนั้นเทียบเท่ากับที่ไม่มีอยู่ ขวา?
isambitd

@mickzer ตรวจสอบการเปลี่ยนแปลงทันที
isambitd

1
เพื่อตอบกลับความคิดเห็นก่อนหน้านี้คุณไม่พฤติกรรมบน HTTP 500 อาจต้องลองอีกครั้ง 401/403 เพื่อแก้ไขการตรวจสอบสิทธิ์ ฯลฯ เป็นสิ่งสำคัญในการตรวจสอบรหัสข้อผิดพลาดจริง
mickzer

0

มีวิธีหนึ่งง่ายๆที่เราสามารถตรวจสอบว่ามีไฟล์อยู่หรือไม่ในถัง S3 เราไม่จำเป็นต้องใช้ข้อยกเว้นสำหรับสิ่งนี้

sesssion = boto3.Session(aws_access_key_id, aws_secret_access_key)
s3 = session.client('s3')

object_name = 'filename'
bucket = 'bucketname'
obj_status = s3.list_objects(Bucket = bucket, Prefix = object_name)
if obj_status.get('Contents'):
    print("File exists")
else:
    print("File does not exists")

สิ่งนี้จะไม่ถูกต้องหากไฟล์ที่ขึ้นต้นด้วยobject_nameมีอยู่ในที่ฝากข้อมูล เช่นจะกลับมาเป็นบวกเท็จถ้าคุณตรวจสอบmy_file.txt.oldversion my_file.txtบิตของขอบกรณีส่วนใหญ่ แต่สำหรับบางสิ่งที่กว้างพอ ๆ กับ "มีไฟล์อยู่" ซึ่งคุณมีแนวโน้มที่จะใช้ตลอดทั้งแอปพลิเคชันของคุณอาจคุ้มค่าที่จะพิจารณา
Andrew Schwartz

0

หากคุณค้นหาคีย์ที่เทียบเท่ากับไดเรกทอรีคุณอาจต้องการแนวทางนี้

session = boto3.session.Session()
resource = session.resource("s3")
bucket = resource.Bucket('mybucket')

key = 'dir-like-or-file-like-key'
objects = [o for o in bucket.objects.filter(Prefix=key).limit(1)]    
has_key = len(objects) > 0

สิ่งนี้ใช้ได้สำหรับคีย์หลักหรือคีย์ที่เท่ากับไฟล์หรือคีย์ที่ไม่มีอยู่ ฉันลองใช้วิธีที่ชอบด้านบนและล้มเหลวในคีย์หลัก


0

ฉันสังเกตเห็นว่าเพียงแค่จับข้อยกเว้นโดยใช้botocore.exceptions.ClientErrorเราจำเป็นต้องติดตั้ง botocore botocore ใช้พื้นที่ดิสก์สูงถึง 36M นี่เป็นสิ่งที่กระทบโดยเฉพาะอย่างยิ่งถ้าเราใช้ฟังก์ชั่น aws lambda ถ้าเราใช้ข้อยกเว้นเราสามารถข้ามโดยใช้ไลบรารีพิเศษ!

  • ฉันกำลังตรวจสอบว่านามสกุลไฟล์เป็น '.csv'
  • สิ่งนี้จะไม่ส่งข้อยกเว้นหากไม่มีที่เก็บข้อมูล!
  • สิ่งนี้จะไม่ส่งข้อยกเว้นหากที่เก็บข้อมูลมีอยู่ แต่ไม่มีวัตถุ!
  • สิ่งนี้จะทำให้เกิดข้อยกเว้นถ้าที่เก็บข้อมูลว่างเปล่า!
  • สิ่งนี้ทำให้เกิดข้อยกเว้นถ้าที่ฝากข้อมูลไม่มีสิทธิ์!

รหัสมีลักษณะเช่นนี้ กรุณาแบ่งปันความคิดของคุณ:

import boto3
import traceback

def download4mS3(s3bucket, s3Path, localPath):
    s3 = boto3.resource('s3')

    print('Looking for the csv data file ending with .csv in bucket: ' + s3bucket + ' path: ' + s3Path)
    if s3Path.endswith('.csv') and s3Path != '':
        try:
            s3.Bucket(s3bucket).download_file(s3Path, localPath)
        except Exception as e:
            print(e)
            print(traceback.format_exc())
            if e.response['Error']['Code'] == "404":
                print("Downloading the file from: [", s3Path, "] failed")
                exit(12)
            else:
                raise
        print("Downloading the file from: [", s3Path, "] succeeded")
    else:
        print("csv file not found in in : [", s3Path, "]")
        exit(12)

AWS กล่าวว่า python runtimes มาพร้อมกับ boto3 ที่ติดตั้งไว้ล่วงหน้า: docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
rinat.io

0

ใครก็ตามสามารถสรุปได้ว่าอันไหนเป็นวิธีที่มีประสิทธิภาพที่สุดในการตรวจสอบว่ามีวัตถุอยู่ใน S3 หรือไม่?

ฉันคิดว่า head_object อาจชนะเพราะตรวจสอบข้อมูลเมตาที่เบากว่าวัตถุจริง


0

จากhttps://www.peterbe.com/plog/fastest-way-to-find-out-if-a-file-exists-in-s3สิ่งนี้ชี้ให้เห็นว่าเป็นวิธีที่เร็วที่สุด:

import boto3

boto3_session = boto3.session.Session()
s3_session_client = boto3_session.client("s3")
response = s3_session_client.list_objects_v2(
    Bucket=bc_df_caches_bucket, Prefix=s3_key
)
for obj in response.get("Contents", []):
    if obj["Key"] == s3_key:
        return True
return False

-1

เช็คเอาท์

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

ตรวจสอบเพื่อดูว่ามีคีย์เฉพาะอยู่ในที่เก็บข้อมูลหรือไม่ วิธีนี้ใช้การร้องขอ HEAD เพื่อตรวจสอบการมีอยู่ของคีย์ คืนค่า: อินสแตนซ์ของวัตถุคีย์หรือไม่มี

จากBoto S3 Docs

คุณสามารถเรียก bucket.get_key (ชื่อคีย์) และตรวจสอบว่าวัตถุที่ส่งคืนเป็น None หรือไม่


สิ่งนี้ใช้ไม่ได้กับ boto3 ตามที่ร้องขอโดย OP
MarkNS

AWoto boto มีสองรุ่น คำตอบนี้ใช้ไม่ได้กับเวอร์ชันที่คำถามร้องขอ
MarkNS

แน่นอนว่ามันไม่ใช่คำตอบที่ถูกต้องสำหรับ OP แต่มันช่วยฉันได้เพราะฉันต้องใช้ boto v2 นั่นคือเหตุผลที่ฉันลบคะแนนลบ
haͣrͬukaͣreͤrͬu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.