বোটো 3 সহ একটি বালতির সামগ্রীর তালিকাবদ্ধকরণ


198

আমি কীভাবে দেখতে পারি যে এস 3 এর সাথে একটি বালতির ভিতরে রয়েছে boto3? (যেমন একটি "ls")?

নিম্নলিখিতগুলি করছেন:

import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('some/path/')

আয়:

s3.Bucket(name='some/path/')

আমি কীভাবে এর বিষয়বস্তু দেখতে পারি?

উত্তর:


241

বিষয়বস্তু দেখার একটি উপায় হ'ল:

for my_bucket_object in my_bucket.objects.all():
    print(my_bucket_object)

1
আমি কী বালতিতে বা বোটো 3 ব্যবহার করে নির্দিষ্ট ডিলিমিটারের সাথে নির্দিষ্ট পাথের নীচে কীগুলি আনতে পারি ??
রাহুল কেপি

109
আপনি বলতে সক্ষম হবেন mybucket.objects.filter(Prefix='foo/bar')এবং এটি কেবলমাত্র সেই উপসর্গের সাথে অবজেক্টগুলি তালিকাভুক্ত করবে। আপনি একটি Delimiterপরামিতি পাস করতে পারেন ।
গারানাট

3
boto3 AttributeError সঙ্গে কাজ করছে না: 'এস 3' অবজেক্ট কোন অ্যাট্রিবিউট আছে 'বস্তু'
Shek

2
@garnaat আপনার মন্তব্য উল্লেখ করে যে ফিল্টার পদ্ধতিটি আমাকে সত্যই সহায়তা করেছে (আমার কোডটি অনেক সহজ এবং দ্রুত শেষ হয়েছে) - আপনাকে ধন্যবাদ!
এডওয়ার্ড ডিকসন

24
আমি ব্যবহার বিরুদ্ধে পরামর্শ চাই objectএকটি পরিবর্তনশীল নামের যেমন বিশ্বব্যাপী টাইপ ছায়া হবে object
oliland

100

এটি একটি 'এলএস' এর অনুরূপ তবে এটি উপসর্গ ফোল্ডার কনভেনশনকে বিবেচনায় নেয় না এবং বালতিতে থাকা বস্তুগুলির তালিকা তৈরি করে। এটি মূল নামের অংশ যা উপসর্গগুলি ফিল্টার করার জন্য পাঠকের কাছে ছেড়ে দেওয়া হয়েছে।

পাইথন 2 এ:

from boto.s3.connection import S3Connection

conn = S3Connection() # assumes boto.cfg setup
bucket = conn.get_bucket('bucket_name')
for obj in bucket.get_all_keys():
    print(obj.key)

পাইথন 3 এ:

from boto3 import client

conn = client('s3')  # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='bucket_name')['Contents']:
    print(key['Key'])

39
আপনি যদি উপসর্গটিও পাশাপাশি ব্যবহার করতে চান তবে আপনি এটি এটি করতে পারেন:conn.list_objects(Bucket='bucket_name', Prefix='prefix_string')['Contents']
মার্কোনভাক

13
এটি কেবলমাত্র প্রথম 1000 কীগুলি তালিকাভুক্ত করে। ডক্টরসিং থেকে: "একটি বালতিতে কিছু বা সমস্ত (1000 পর্যন্ত) অবজেক্ট ফিরিয়ে দেয়।" এছাড়াও, সুপারিশ করা হয় আপনি তালিকা_ওজেক্টসগুলির পরিবর্তে list_objects_v2 ব্যবহার করুন (যদিও এটি কেবল প্রথম 1000 কীগুলি দেয়)।
ব্রেট উইদমিয়ার

3
এই সীমাবদ্ধতাটি প্যাগিনেটরগুলি
v25

44

আমি ধরে নিচ্ছি আপনি পৃথকভাবে প্রমাণীকরণ কনফিগার করেছেন।

import boto3
s3 = boto3.resource('s3')

my_bucket = s3.Bucket('bucket_name')

for file in my_bucket.objects.all():
    print(file.key)

30

আপনি যদি অ্যাক্সেস এবং সিক্রেট কীগুলি পাস করতে চান (যা আপনার করা উচিত নয়, কারণ এটি সুরক্ষিত নয়):

from boto3.session import Session

ACCESS_KEY='your_access_key'
SECRET_KEY='your_secret_key'

session = Session(aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('your_bucket')

for s3_file in your_bucket.objects.all():
    print(s3_file.key)

13
এটি ~ / .aws / শংসাপত্রগুলিতে শংসাপত্রের ফাইল থাকার চেয়ে কম সুরক্ষিত। যদিও এটি একটি বৈধ সমাধান।
নিউ এভারেস্ট

6
এটি উত্স নিয়ন্ত্রণে গোপনীয়তা রক্ষা করা প্রয়োজন। ভাল না.
জান গ্রোথ

2
কোনও উত্তর সম্পর্কিত প্রামাণিকতা পদ্ধতি যা সমস্ত বোটো রিসোর্সের জন্য সাধারণ এবং একটি খারাপ অনুশীলন সুরক্ষা অনুসারে যুক্ত করা যায়
উত্তরটি তালিকাভুক্ত

সুরক্ষা সম্পর্কে উত্তরে একটি অস্বীকৃতি যুক্ত করা হয়েছে।
rjurney

কীগুলি কী / ভল্টের (হ্যাশিকর্প) মতো গোপনীয় ব্যবস্থাপনার দ্বারা সরবরাহ করা হয়েছিল - just / .aws / শংসাপত্রগুলিতে কেবল শংসাপত্র ফাইল রাখার চেয়ে কী ভাল হবে না?
সানিএক

25

বৃহত্তর কী তালিকাগুলি হ্যান্ডেল করার জন্য (উদাহরণস্বরূপ যখন ডিরেক্টরি তালিকাটি 1000 আইটেমের বেশি হয়), আমি নিম্নলিখিত কোডগুলি একাধিক তালিকার সাথে মূল মানগুলি (অর্থাত্ ফাইল নামগুলি) জমা করতে (প্রথম লাইনের জন্য উপরের অ্যামেলিওকে ধন্যবাদ) ব্যবহার করেছি। কোডটি অজগর 3 এর জন্য:

    from boto3  import client
    bucket_name = "my_bucket"
    prefix      = "my_key/sub_key/lots_o_files"

    s3_conn   = client('s3')  # type: BaseClient  ## again assumes boto.cfg setup, assume AWS S3
    s3_result =  s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter = "/")

    if 'Contents' not in s3_result:
        #print(s3_result)
        return []

    file_list = []
    for key in s3_result['Contents']:
        file_list.append(key['Key'])
    print(f"List count = {len(file_list)}")

    while s3_result['IsTruncated']:
        continuation_key = s3_result['NextContinuationToken']
        s3_result = s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter="/", ContinuationToken=continuation_key)
        for key in s3_result['Contents']:
            file_list.append(key['Key'])
        print(f"List count = {len(file_list)}")
    return file_list

20

আমার এস 3 keysইউটিলিটি ফাংশনটি মূলত @ হেফেসটাসের উত্তরের একটি অনুকূলিত সংস্করণ:

import boto3


s3_paginator = boto3.client('s3').get_paginator('list_objects_v2')


def keys(bucket_name, prefix='/', delimiter='/', start_after=''):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    start_after = (start_after or prefix) if prefix.endswith(delimiter) else start_after
    for page in s3_paginator.paginate(Bucket=bucket_name, Prefix=prefix, StartAfter=start_after):
        for content in page.get('Contents', ()):
            yield content['Key']

আমার পরীক্ষায় (বোটো3 1.9.84), এটি সমমানের (তবে সহজ) কোডের তুলনায় উল্লেখযোগ্যভাবে দ্রুত:

import boto3


def keys(bucket_name, prefix='/', delimiter='/'):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    bucket = boto3.resource('s3').Bucket(bucket_name)
    return (_.key for _ in bucket.objects.filter(Prefix=prefix))

এস 3 ইউটিএফ -8 বাইনারি বাছাই করা ফলাফলের গ্যারান্টি হিসাবে , start_afterপ্রথম ক্রিয়ায় একটি অপ্টিমাইজেশন যুক্ত করা হয়েছে।


এটি এখন পর্যন্ত সেরা উত্তর। আমি যখন স্ক্রোলটি নামছিলাম তখন আমি @ হেফেসটাসের উত্তরটি পরিবর্তন করছি (কারণ এটি সর্বোচ্চ ছিল)। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত এবং সংক্ষিপ্ত হওয়ার জন্য অতিরিক্ত পয়েন্ট পাওয়া উচিত। আমি যুক্ত করব যে list()ফাইলগুলির একটি তালিকা ফেরত দেওয়ার জন্য দ্বিতীয় কোড থেকে জেনারেটরটি মোড়ানো দরকার ।
রিচার্ড

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

6

লুপের জন্য লুপের মাধ্যমে পুনরুক্তি করার চেয়ে আরও বিড়ম্বনাজনক উপায় আপনি কেবল নিজের এস 3 বালতির ভিতরে থাকা সমস্ত ফাইলের মূল বিষয়টিকে মুদ্রণ করতে পারবেন:

session = Session(aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key)
s3 = session.resource('s3')
bucket = s3.Bucket('bucket_name')

files_in_s3 = bucket.objects.all() 
#you can print this iterable with print(list(files_in_s3))

3
@ পেটিজুরিখ, আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে আমার উত্তরের এমন ক্ষুদ্রতম সম্পাদনা - আমার উত্তরের শুরুতে একটি "এ" কে মূলধন "এ" এর পরিবর্তে আমার খ্যাতি -২ দ্বারা নামিয়ে আনা হয়েছে, তবে আমি আপনাকে উভয়ই মনে করি এবং আমি একমত হতে পারি এটি কেবল আপনার সংশোধনই মোটেই প্রাসঙ্গিক নয়, তবে প্রকৃতপক্ষে ক্ষুদ্রতম, আপনি কি বলবেন না? শিশুসুলভ সংশোধনগুলির চেয়ে সামগ্রীতে ফোকাস করুন, সর্বাধিক বাধ্যবাধক ওলবয়
ড্যানিয়েল ভিয়েরা

এটি দুটি পৃথক মিথস্ক্রিয়া ছিল। 1. আমি আপনার উত্তর সম্পাদনা করেছি যা এমনকি ছোটখাটো ভুল বানানের জন্যও প্রস্তাবিত। আমি সম্মত হই যে, অপ্রাপ্তবয়স্ক এবং তুচ্ছ বিষয়গুলির মধ্যে সীমাটি দ্ব্যর্থহীন। আমি কোনও পোস্টকে নিম্নচোট করি না কারণ আমি ত্রুটিগুলি দেখি এবং আমি এই ক্ষেত্রে করি নি। আমি কেবল দেখি সমস্ত ত্রুটিগুলি ঠিক করেছি।
পেটিজুরিচ

২. আমি আপনার উত্তরটিকে নিম্নচাপিত করেছি কারণ আপনি লিখেছেন এটি files_in_s3একটি "তালিকার অবজেক্ট"। পাইথনে তেমন কিছুই নেই। এটি বরং একটি পুনরাবৃত্তিযোগ্য এবং আমি আপনার কোডটি কাজ করতে পারি না এবং তাই হ্রাস করা। আমি ত্রুটিটি পেয়েছি এবং আপনার পয়েন্টটি দেখেছি তবে আমার ডাউনটোটটি পূর্বাবস্থায় ফেরাতে পারিনি।
পেটিজুরিচ

5
@ পেটিজুরিচ কোনও সমস্যা নেই, আপনার কথাটি বুঝতে পেরেছেন, পাইথন-এ কেবল একটি জিনিস, পাইথনের একটি তালিকা একটি বস্তু কারণ পাইথনের প্রায় সব কিছুই একটি বস্তু, তবে এটি আরও অনুসরণ করে যে একটি তালিকাও একটি পুনরাবৃত্তিযোগ্য, তবে প্রথম এবং সর্বাগ্রে, এটি একটি বস্তু! এই কারণেই আমি আপনার ডাউনটোটটি বুঝতে পারি নি you আপনি এমন কিছু ভোট দিয়েছিলেন যা সঠিক এবং কোড যা কাজ করে works যাইহোক, আপনার ক্ষমা এবং সমস্ত সেরা জন্য ধন্যবাদ
ড্যানিয়েল ভিয়েরা

1
পাইপজুরিখ পাইথনের সমস্ত কিছু একটি বিষয়। "তালিকার অবজেক্ট" সম্পূর্ণ গ্রহণযোগ্য।
জাচ গারউড

4

ObjectSummary:

দুটি শনাক্তকারী যা অবজেক্টস্মামরিতে সংযুক্ত রয়েছে:

  • bucket_name
  • চাবি

বোটো 3 এস 3: অবজেক্টস্মোমারি

এডাব্লুএস এস 3 ডকুমেন্টেশন থেকে অবজেক্ট কী সম্পর্কিত আরও:

অবজেক্ট কী:

আপনি যখন কোনও বস্তু তৈরি করেন, আপনি কী নামটি নির্দিষ্ট করেন, যা বালতিতে অবজেক্টটিকে স্বতন্ত্রভাবে চিহ্নিত করে। উদাহরণস্বরূপ, অ্যামাজন এস 3 কনসোলে (অ্যাডাব্লুএস ম্যানেজমেন্ট কনসোল দেখুন) আপনি যখন বালতিটি হাইলাইট করেন তখন আপনার বালতিতে থাকা বস্তুর একটি তালিকা উপস্থিত হয়। এই নামগুলি হ'ল বস্তু কীগুলি। কীটির নাম হ'ল ইউনিকোড অক্ষরগুলির ক্রম যা ইউটিএফ -8 এনকোডিং সর্বাধিক 1024 বাইট দীর্ঘ।

অ্যামাজন এস 3 ডেটা মডেলটি একটি সমতল কাঠামো: আপনি একটি বালতি তৈরি করেন, এবং বালতি জিনিসগুলি সঞ্চয় করে। সাববকেট বা সাবফোল্ডারগুলির কোনও স্তরক্রম নেই; তবে, আপনি অ্যামাজন এস 3 কনসোলের মতো কী নামের উপসর্গ এবং ডিলিমিটারগুলি ব্যবহার করে যৌক্তিক শ্রেণিবিন্যাস অনুমান করতে পারেন। অ্যামাজন এস 3 কনসোলটি ফোল্ডারগুলির ধারণাকে সমর্থন করে। মনে করুন যে আপনার বালতিতে (অ্যাডমিন-তৈরি) নিম্নলিখিত অবজেক্ট কী সহ চারটি অবজেক্ট রয়েছে:

উন্নয়ন / Projects1.xls

মূলধন যোগান / statement1.pdf

ব্যক্তিগত / taxdocument.pdf

S3-dg.pdf

রেফারেন্স:

এডাব্লুএস এস 3: অবজেক্ট কীগুলি

এখানে কয়েকটি উদাহরণ কোড রয়েছে যা দেখায় যে কীভাবে বালতির নাম এবং অবজেক্ট কী পাওয়া যায়।

উদাহরণ:

import boto3
from pprint import pprint

def main():

    def enumerate_s3():
        s3 = boto3.resource('s3')
        for bucket in s3.buckets.all():
             print("Name: {}".format(bucket.name))
             print("Creation Date: {}".format(bucket.creation_date))
             for object in bucket.objects.all():
                 print("Object: {}".format(object))
                 print("Object bucket_name: {}".format(object.bucket_name))
                 print("Object key: {}".format(object.key))

    enumerate_s3()


if __name__ == '__main__':
    main()

3

প্রমাণীকরণের পদ্ধতি সহ আমি এটি এটির মতো করে করেছি:

s3_client = boto3.client(
                's3',
                aws_access_key_id='access_key',
                aws_secret_access_key='access_key_secret',
                config=boto3.session.Config(signature_version='s3v4'),
                region_name='region'
            )

response = s3_client.list_objects(Bucket='bucket_name', Prefix=key)
if ('Contents' in response):
    # Object / key exists!
    return True
else:
    # Object / key DOES NOT exist!
    return False

2
#To print all filenames in a bucket
import boto3

s3 = boto3.client('s3')

def get_s3_keys(bucket):

    """Get a list of keys in an S3 bucket."""
    resp = s3.list_objects_v2(Bucket=bucket)
    for obj in resp['Contents']:
      files = obj['Key']
    return files


filename = get_s3_keys('your_bucket_name')

print(filename)

#To print all filenames in a certain directory in a bucket
import boto3

s3 = boto3.client('s3')

def get_s3_keys(bucket, prefix):

    """Get a list of keys in an S3 bucket."""
    resp = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)
    for obj in resp['Contents']:
      files = obj['Key']
      print(files)
    return files


filename = get_s3_keys('your_bucket_name', 'folder_name/sub_folder_name/')

print(filename)

"Get_s3_keys" উভয়ই কেবল শেষ কীটি দেয় returns
আলেক্সি ওয়াজনভ

এটি বালতিতে থাকা সমস্ত ফাইলের তালিকা প্রদর্শন করে; প্রশ্নটি কীভাবে করা যায় তা ছিল ls। আপনি কীভাবে এটি করবেন .. কেবল রুটটিতে ফাইলগুলি মুদ্রণ করুন
হারমান

1

উপরের মন্তব্যের একটিতে @ হেফাইস্টাসের কোডে সামান্য পরিবর্তন করে, একটি নির্দিষ্ট পথে ফোল্ডার এবং অবজেক্ট (ফাইল) তালিকাভুক্ত করার জন্য নীচের পদ্ধতিটি লিখেছিলেন। S3 ls কমান্ডের মতো কাজ করে।

from boto3 import session

def s3_ls(profile=None, bucket_name=None, folder_path=None):
    folders=[]
    files=[]
    result=dict()
    bucket_name = bucket_name
    prefix= folder_path
    session = boto3.Session(profile_name=profile)
    s3_conn   = session.client('s3')
    s3_result =  s3_conn.list_objects_v2(Bucket=bucket_name, Delimiter = "/", Prefix=prefix)
    if 'Contents' not in s3_result and 'CommonPrefixes' not in s3_result:
        return []

    if s3_result.get('CommonPrefixes'):
        for folder in s3_result['CommonPrefixes']:
            folders.append(folder.get('Prefix'))

    if s3_result.get('Contents'):
        for key in s3_result['Contents']:
            files.append(key['Key'])

    while s3_result['IsTruncated']:
        continuation_key = s3_result['NextContinuationToken']
        s3_result = s3_conn.list_objects_v2(Bucket=bucket_name, Delimiter="/", ContinuationToken=continuation_key, Prefix=prefix)
        if s3_result.get('CommonPrefixes'):
            for folder in s3_result['CommonPrefixes']:
                folders.append(folder.get('Prefix'))
        if s3_result.get('Contents'):
            for key in s3_result['Contents']:
                files.append(key['Key'])

    if folders:
        result['folders']=sorted(folders)
    if files:
        result['files']=sorted(files)
    return result

এটি প্রদত্ত পথে সমস্ত অবজেক্ট / ফোল্ডার তালিকাভুক্ত করে। ফোল্ডার_পথটি ডিফল্টরূপে কিছুই হিসাবে ছেড়ে যায় এবং পদ্ধতিটি বালতিটির মূলের তাত্ক্ষণিক বিষয়বস্তু তালিকাভুক্ত করে।


0

সমাধান এখানে

আমদানি বোটো 3

s3 = boto3.resource ('s3')

BUCKET_NAME = 'আপনার এস 3 বালতির নাম যেমন''ডিলেটমেস্টিং 11' '

allFiles = s3.Bucket (BUCKET_NAME) .objects.all ()

AllFiles এ ফাইলের জন্য: মুদ্রণ (file.key)


0

এটি নিম্নলিখিত হিসাবে করা যেতে পারে:

csv_files = s3.list_objects_v2(s3_bucket_path)
    for obj in csv_files['Contents']:
        key = obj['Key']

0

সুতরাং আপনি aws s3 lsবোটো 3 এর সমতুল্য চাইছেন। এটি সমস্ত শীর্ষ স্তরের ফোল্ডার এবং ফাইল তালিকাভুক্ত করা হবে। এটি আমি যে নিকটতম পেতে পারি; এটি কেবলমাত্র শীর্ষ স্তরের সমস্ত ফোল্ডার তালিকাভুক্ত করে। এত সহজ অপারেশন কতটা কঠিন তা অবাক করে।

import boto3

def s3_ls():
  s3 = boto3.resource('s3')
  bucket = s3.Bucket('example-bucket')
  result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                           Delimiter='/')
  for o in result.get('CommonPrefixes'):
    print(o.get('Prefix'))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.