বোটো 3 ব্যবহার করে এস 3-র বালতিতে কী রয়েছে কিনা তা পরীক্ষা করুন


164

বোটো 3-তে কোনও কী রয়েছে কিনা তা জানতে চাই। আমি বালতির বিষয়বস্তুগুলি লুপ করতে পারি এবং কীটি মেলে কিনা তা পরীক্ষা করতে পারি।

তবে এটি দীর্ঘ এবং একটি ওভারকিল বলে মনে হচ্ছে। বোটো 3 সরকারী দস্তাবেজগুলি কীভাবে এটি করবেন তা স্পষ্টভাবে জানিয়েছে।

আমি সম্ভবত স্পষ্ট মিস করছি। কেউ কি আমাকে ইঙ্গিত করতে পারে যে আমি কীভাবে এটি অর্জন করতে পারি।

উত্তর:


195

বোটো 2 এর boto.s3.key.Keyঅবজেক্টে এমন existsপদ্ধতি ছিল যা পরীক্ষামূলকভাবে হেড অনুরোধ করে ফলাফলটি দেখে এস 3-তে কী উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখা গেছে, তবে মনে হয় এটি আর বিদ্যমান নেই। আপনার নিজের এটি করতে হবে:

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() একটি একক কীটির জন্য একটি হেড অনুরোধ জানায়, এটি দ্রুত, এমনকি যদি প্রশ্নে থাকা অবজেক্টটি বড় হয় বা আপনার বালতিতে অনেকগুলি বস্তু রয়েছে।

অবশ্যই, আপনি সম্ভবত এটি পরীক্ষা করে নিচ্ছেন যে আপনি এটি ব্যবহার করার পরিকল্পনা করছেন কারণ এটি বিদ্যমান। যদি এটি হয় তবে আপনি এটি সম্পর্কে ভুলে যেতে পারেন load()এবং একটি get()বা download_file()সরাসরি করতে পারেন, তবে সেখানে ত্রুটি কেসটি পরিচালনা করতে পারেন।


দ্রুত উত্তর ভ্রমন জন্য ধন্যবাদ। বোটো 3 এর জন্য আমার কেবল একই দরকার।
প্রভাকর শানমুগাম

12
কারণ boto3, মনে হচ্ছে আপনি এই মুহুর্তে সবচেয়ে ভাল করতে পারেন হ'ল head_objectকীটির জন্য মেটাডেটা চেষ্টা করার চেষ্টা করে এবং তারপরে ত্রুটিটি উপস্থিত না থাকলে এটি পরিচালনা করুন।
নাউটা

1
@ লিওনিড আপনি অবশ্যই পারতেন, তবে কেবলমাত্র আপনি যদি এটি কোনও ফাংশন বা পদ্ধতিতে আবৃত করেন তবে এটি আপনার উপর নির্ভর করে। আমি উদাহরণ কোডটি কিছুটা সংশোধন করেছি যাতে existsবুলিয়ান চলে যায় এবং এটি আরও পরিষ্কার হয় (আমি আশা করি!) যে লোকেরা তাদের পরিস্থিতির সাথে এটি খাপ খাইয়ে নেবে বলে মনে করা হচ্ছে।
Wander Nauta

2
-1; আমার জন্য কাজ করে না। Boto3 সংস্করণ 1.5.26 উপর আমি দেখতে e.response['Error']['Code']ভালো একটি মান "NoSuchKey", না "404"। এই উত্তরটি লিখিত হওয়ার পরে আমি লাইব্রেরি সংস্করণে তফাত বা এপিআইতে পরিবর্তনের কারণে তা পরীক্ষা করে দেখিনি। যেভাবেই হোক, বোটো 3 এর আমার সংস্করণে, চেকিংয়ের চেয়ে সংক্ষিপ্ত পন্থা e.response['Error']['Code']হ'ল কেবল s3.meta.client.exceptions.NoSuchKeyপ্রথম স্থানে।
মার্ক আমেরিকা 20'18

2
যদি আপনি একটি S3 ব্যবহার করছেন client(যেমন একটি উল্টোদিকে resource) তাহলে কি s3.head_object(Bucket='my_bucket', Key='my_key')পরিবর্তেs3.Object(...).load()
user2426679

126

আমি নিয়ন্ত্রণ প্রবাহের জন্য ব্যতিক্রমগুলি ব্যবহার করার বড় ভক্ত নই। এটি একটি বিকল্প পদ্ধতি যা বোটো 3 এ কাজ করে:

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

এভিলপুপেটমাস্টার আপডেটের জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে আমি যখন শেষ পরীক্ষা করেছি তখন আমার কাছে বালতি অ্যাক্সেসের অধিকার নেই। আপনার উত্তর আমার প্রশ্নের জন্য উপযুক্ত, তাই আমি আপনাকে ভোট দিয়েছি। তবে আমি ইতিপূর্বে উত্তর হিসাবে অনেক আগেই উত্তরটি চিহ্নিত করেছি। আপনার সাহায্যের জন্য ধন্যবাদ.
প্রভাকর শানমুগম

27
এই তালিকার অনুরোধ (প্রাপ্তির চেয়ে 12.5x ব্যয়বহুল) হিসাবে গণনা করা হয় না? আপনি যদি এটি ১০০ মিলিয়ন অবজেক্টের জন্য করেন তবে তা কিছুটা দামি হতে পারে ... আমার অনুভূতি আছে যে দুর্ভাগ্যক্রমে ধরা-ব্যতিক্রমী পদ্ধতিটি সেরা।
পিয়েরে ডি

21
অনুরোধ অনুসারে তালিকাটি ব্যয়বহুল হিসাবে 12.5x হতে পারে তবে একক অনুরোধটি 100 মিলিয়ন অবজেক্টও দিতে পারে যেখানে একক প্রাপ্তি কেবল এটির সাথে ফিরে আসতে পারে। সুতরাং আপনার অনুমানের ক্ষেত্রে, তালিকাটি সহ সমস্ত 100 মিলিয়ন আনা এবং তারপরে স্থানীয়ভাবে তুলনা করা 100 মিটার পৃথক ব্যক্তির চেয়ে তুলনামূলকভাবে সস্তা। 1000x দ্রুত উল্লেখ না করা যেহেতু আপনার প্রতিটি বস্তুর জন্য HTTP রাউন্ড ট্রিপের প্রয়োজন হবে না।
এভিলপুপেটমাস্টার

যখন আমার ফাইলটি এস 3 বালতির মধ্যে ফোল্ডারগুলির ভিতরে থাকবে তখন এটি কাজ করছে না
user3186866

2
@ ইউজার 3186866 কারণ এস 3 এর আসলে "ফোল্ডার" নেই। সমস্ত বস্তু তাদের প্রদত্ত পথে ফাইল হিসাবে বিদ্যমান exist ফোল্ডারগুলি আমাদের স্টোরেজটির কাঠামোটি সংগঠিত এবং বুঝতে সহায়তা করার জন্য একটি সরঞ্জাম, তবে বাস্তবে, এস 3 বালতিগুলি কেবল এটিই, বালতি।
ইবতকিন

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 ইত্যাদি পাস করতে হবে না .আপনি কনফিগারেশন, আপনি কেবল পারেনs3 = boto3.client('s3')
অ্যান্ডি হেডেন

20
আমার মনে হয় এই পরীক্ষাটি যুক্ত করা আপনাকে কিছুটা বেশি আত্মবিশ্বাস দেয় যা বস্তুটির সত্যই উপস্থিতি নেই, বরং ব্যতিক্রম উত্থাপনে অন্য কোনও ত্রুটির চেয়ে মনে রাখবেন - 'ই' ক্লায়েন্টেরর ব্যতিক্রম উদাহরণ:if e.response['ResponseMetadata']['HTTPStatusCode'] == 404:
রিচার্ড

@ অ্যান্ডি হাইডেন প্রতিটি আউস ব্যয়ের হিসাবে গণনা করার চেষ্টা করবে?
লুপ

2
@ টেলর এটি একটি অনুরোধ কিন্তু কোনও তথ্য স্থানান্তর ছাড়াই।
অ্যান্ডি হেডেন

1
ক্লায়েন্টেররার 400 এর জন্য একটি ক্যাচ, কেবল 404 নয় তাই এটি দৃ rob় নয়।
মিকজার

21

বোটো 3-তে, আপনি যদি কোনও ফোল্ডার (উপসর্গ) বা তালিকা_বজেক্টগুলি ব্যবহার করে কোনও ফাইল অনুসন্ধান করছেন। আপনি প্রতিক্রিয়াতে 'বিষয়বস্তু' এর অস্তিত্বটি অবজেক্টটির অস্তিত্ব আছে কিনা তা পরীক্ষা করে ব্যবহার করতে পারেন। এভিলপুপেটমাস্টারের পরামর্শ অনুসারে ক্যাচগুলি বাদ দিয়ে চেষ্টা চালিয়ে যাওয়ার অন্য উপায়

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" এর মতো কীগুলি ফিরিয়ে দেবে
গুনার চেং

3
এটি কেবল 1000 টি অবজেক্ট পর্যন্ত ফেরত দেয়! boto3.amazonaws.com/v1/docamentation/api/latest/references/…
রোচলর্ড

এই যেমন সবচেয়ে বেশি কার্যকরী সমাধান প্রয়োজন হয় না 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

আপনি এস 3 এফ ব্যবহার করতে পারেন যা মূলত বোটো 3 এর চারপাশে একটি মোড়ক যা সাধারণত ফাইল-সিস্টেম স্টাইলের ক্রিয়াকলাপ প্রকাশ করে:

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

যদিও আমি মনে করি এটি কাজ করবে, প্রশ্নটি বোটো 3 দিয়ে এটি কীভাবে করা যায় সে সম্পর্কে জিজ্ঞাসা করে; এই ক্ষেত্রে, অতিরিক্ত লাইব্রেরি ইনস্টল না করেই সমস্যাটি সমাধান করা ব্যবহারিক।
পলকર્નফিল্ড

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

এফডাব্লুআইডাব্লু, এখানে আমি ব্যবহার করছি খুব সাধারণ ফাংশন

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
এটিই কেবলমাত্র প্রতিক্রিয়া যা আমি দেখলাম যে কোনও 'ফাইল' এর তুলনায় একটি 'ফোল্ডার' এর অস্তিত্বের জন্য যাচাইয়ের উদ্দেশ্যে addressed রুটিনগুলির জন্য এটি অত্যন্ত গুরুত্বপূর্ণ যে কোনও ফোল্ডারে নির্দিষ্ট ফাইল নয়, নির্দিষ্ট ফোল্ডার রয়েছে কিনা তা জানতে হবে।
ডেভ ক্যাম্পবেল

যদিও এটি একটি সতর্কতার সাথে উত্তর দেওয়া কেবল তখনই কার্যকর যখন ব্যবহারকারীরা বুঝতে পারেন যে কোনও ফোল্ডারের ধারণা এই ক্ষেত্রে বিভ্রান্ত করছে। একটি বালতিতে S3-তে একটি ফাঁকা 'ফোল্ডার' উপস্থিত থাকতে পারে এবং যদি তাই হয় তবে isdir_s3 ফিরে আসবে মিথ্যা আমাকে বাছাই করতে কয়েক মিনিট সময় নিয়েছিল আমি উত্তরটি সম্পাদনা করার বিষয়ে ভাবছিলাম যেন ভাবটি> 0 এ পরিবর্তিত হয়েছে তবে আপনি পাবেন ফলাফলটি আপনি প্রত্যাশা করছেন
পাইনেইউবি

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

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

3

এটি উপসর্গ এবং কী উভয়ই পরীক্ষা করতে পারে এবং সর্বাধিক 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

1

আপনার যদি কোনও ডিরেক্টরি বা বালতিতে 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


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

বোটো 3-এর জন্য, অবজেক্টস্মোমারি ব্যবহার করা যেতে পারে কোনও বস্তুর উপস্থিতি আছে কিনা তা পরীক্ষা করতে।

একটি অ্যামাজন এস 3 বালতিতে সঞ্চিত কোনও সামগ্রীর সংক্ষিপ্তসার রয়েছে। এই অবজেক্টটিতে অবজেক্টের পূর্ণ মেটাডেটা বা এর কোনও সামগ্রী নেই

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পরিবর্তে আপনি ব্যবহার করতে পারেন । ফাংশন বস্তুর এটি শুধুমাত্র সারসংক্ষেপ সংগ্রহ উদ্ধার নেই।Objectget()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

আপনি এর জন্য বোটো 3 ব্যবহার করতে পারেন।

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

এখানে কীটি আপনি যে পথটি দেখতে চান তা বিদ্যমান বা নেই is


একটি সাধারণ %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

@ মিকজার এখনই পরিবর্তনগুলি পরীক্ষা করুন।
isambitd

1
আপনার পূর্ববর্তী মন্তব্যে জবাব দেওয়ার জন্য, না, এইচটিটিপি 500-তে আচরণটি পুনরায় চেষ্টা করা যেতে পারে, লেখককে ঠিক করার জন্য 401/403 ইত্যাদি the প্রকৃত ত্রুটি কোডটি যাচাই করা গুরুত্বপূর্ণ।
মিকজার

0

একটি সহজ উপায় রয়েছে যার মাধ্যমে আমরা পরীক্ষা করতে পারি যে ফাইলটি এস 3 বালতিতে রয়েছে কি না। আমাদের এটির জন্য ব্যতিক্রম ব্যবহার করার দরকার নেই

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। বেশিরভাগ ক্ষেত্রে প্রান্তের ক্ষেত্রে কিছুটা হলেও, "ফাইলটির উপস্থিতি রয়েছে" এর মতো বিস্তৃত কিছু হিসাবে আপনি সম্ভবত আপনার অ্যাপ্লিকেশন জুড়ে সম্ভবত ব্যবহার করার সম্ভাবনা বিবেচনা করবেন।
অ্যান্ড্রু শোয়ার্জ

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আমাদের বোটোকোর ইনস্টল করা দরকার। বোটোকোর 36M ডিস্ক স্থান গ্রহণ করে। এটি যদি আমরা লাম্বদা ফাংশনগুলি ব্যবহার করি তবে এটি বিশেষত প্রভাব ফেলবে। এর জায়গায় যদি আমরা কেবল ব্যতিক্রম ব্যবহার করি তবে আমরা অতিরিক্ত লাইব্রেরিটি ব্যবহার করে এড়িয়ে যেতে পারি!

  • ফাইল এক্সটেনশানটি '.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)

এডাব্লুএস জানিয়েছে যে অজগর রানটাইমগুলি বোটো 3 প্রিনস্টলযুক্ত সহ আসে: ডকস.এওএস.এমাজোন.com
লাম্বদা

0

কেবল থ্রেড অনুসরণ করে, কেউ কি সিদ্ধান্ত নিতে পারেন যে কোনটি S3 এ উপস্থিত রয়েছে কিনা তা যাচাই করার সবচেয়ে কার্যকর উপায় কোনটি?

আমি মনে করি হেড_বজেক্টটি বিজয়ী হতে পারে কারণ এটি কেবল মেটাডেটা যাচাই করে যা প্রকৃত বস্তুর চেয়ে হালকা


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
)

বালতিটির মধ্যে কোনও নির্দিষ্ট কী রয়েছে কিনা তা পরীক্ষা করে দেখুন। এই পদ্ধতিটি কীটির অস্তিত্ব পরীক্ষা করার জন্য একটি হেড অনুরোধ ব্যবহার করে। রিটার্নস: কোনও মূল বস্তুর উদাহরণ বা কোনও কিছুই নয়

থেকে Boto এস 3 ডক্স

আপনি কেবল bucket.get_key (কী-নাম) কল করতে পারেন এবং ফিরে আসা বস্তুটি কোনও নয় কিনা তা পরীক্ষা করতে পারেন।


এটি বোটো 3 নিয়ে কাজ করে না, যেমনটি ওপি
মার্কএনএস

AWS বোটো লাইব্রেরির দুটি সংস্করণ রয়েছে। এই উত্তরটি সেই সংস্করণটির সাথে কাজ করে না যা প্রশ্নের দ্বারা অনুরোধ করা হয়েছিল।
মার্কএনএস

এটি নিশ্চিত যে ওপির জন্য সঠিক উত্তর নয়, তবে এটি আমাকে সহায়তা করে কারণ আমার বোটো ভি 2 ব্যবহার করা দরকার। এজন্য আমি নেতিবাচক ভোট সরিয়েছি।
haͣrͬukaͣreͤrͬu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.