কিভাবে অ্যামাজন এস 3 বালতি থেকে ফাইলগুলি মুছবেন?


91

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


কোন (যদি থাকে) পাইথন লাইব্রেরি আপনি এস 3 সমর্থন জন্য ব্যবহার করছেন? বা আপনি কি আপনার পাইথন কোডে বিশ্রাম বা সোপ ইন্টারফেসে সরাসরি যাচ্ছেন?
টিজে ক্রাউডার

4
আমি পাইথন লাইব্রেরি boto.s3
সুহাইল

উত্তর:


94

ব্যবহার boto3(বর্তমানে সংস্করণ 1.4.4) ব্যবহার S3.Object.delete()

import boto3

s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()

4
বস্তুটি উপস্থিত না থাকলে এটি ত্রুটি ছুঁড়ে দেবে?
আকাশ তন্ত্রি

4
@ আকাশতন্ত্রি আমি ব্যক্তিগতভাবে চেষ্টা করি নি, তবে ডক বলেছেন যে এটি নাল সংস্করণটি সরিয়ে দেয় (যদি একটি থাকে) [...] যদি নাল সংস্করণ না থাকে তবে অ্যামাজন এস 3 কোনও বস্তু সরিয়ে ফেলবে না। সুতরাং আমার অনুমান যে এটি কোনও ত্রুটি ফেলবে না। আপনি এটি চেষ্টা ঘটতে থাকলে (শুধু ভালো কিছু করতে s3.Object('existing-bucket', 'bogus-key').delete()এবং দেখুন সেখানে কি ঘটছে এছাড়াও চেষ্টা করুন। s3.Object('bogus-bucket', 'bogus-key').delete()
Kohányi রবার্ট

কবজির মতো কাজ করে, পাইথনের আসল শক্তি
ইউনুস

@ ইউনূস এটা কি মারাত্মক মন্তব্য?
হেনরি হেনরিসন

your-keyএখানে কি your-bucketএস 3 - তে আসল ফাইলটির নাম বোঝানো হচ্ছে ?
10'19 এ আন্ডারওসগুলি

91

বোটো ব্যবহার করে এটি করার আরও একটি উপায় খুঁজে পেয়েছে:

from boto.s3.connection import S3Connection, Bucket, Key

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)

b = Bucket(conn, S3_BUCKET_NAME)

k = Key(b)

k.key = 'images/my-images/'+filename

b.delete_key(k)

10
আপনি যদি একটি বালতি সবকিছু মুছে ফেলতে চেয়েছিলেন, আপনি কাজ করতে পারে:for x in b.list(): b.delete_key(x.key)
jontsai

19
আমি আমার ফাইলটিতে এটি কীভাবে পরিণত হয় তা পছন্দ করিbucket.list()
আর্তুর সাপেক

এই কোড কাজ করতে snippet হিসাবে উপস্থাপন, আপনি আমদানি করতে হবে Bucketএবং Keyখুব,। যেমন রয়েছে:from boto.s3.connection import S3Connection, Bucket, Key
নিক চ্যামাস

আমি >>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connectionদয়া করে বোটো 3
হ্যারি মোরেনো

4
এটি বের করে একটি সমাধান লিখেছেন harrymoreno.com/2017/04/24/…
হ্যারি মোরেনো

74

পাইথন বোটো 3 এসডিকে ব্যবহার করে (এবং ধরে নেওয়া শংসাপত্রগুলি এডাব্লুএসের জন্য সেটআপ করা হয়), নিম্নলিখিতটি বালতিতে একটি নির্দিষ্ট বস্তুকে মুছবে:

import boto3

client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')

6
@ রব বোটো 3 ডকুমেন্টেশন বিভ্রান্তিকর। যদি বস্তুটির সংস্করণ হয় তবে এটি মুছে ফেলা মার্কার তৈরি করবে। এটি অন্যথায় বস্তুটি মুছে ফেলবে।
জারমড

4
পরিষ্কার এবং সহজ। গ্রহণযোগ্য উত্তর হতে পারে এবং অবশ্যই কোহনি রবার্টের উত্তরটির সাথে একত্রীকরণ করা উচিত কারণ উভয়ই কাজের জন্য সর্বোত্তম পন্থা।
পলব

15

পাইথন / জ্যাঙ্গোতে এখানে ২০২০ তে স্বাগতম:

from django.conf import settings 
import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")

উত্তরটি খুঁজে পেতে আমাকে অনেক দীর্ঘ সময় নিয়েছে এবং এটি এর মতো সহজ simple


4

আমি আশ্চর্য হয়েছি যে এই সহজ উপায় নেই key.delete():

from boto.s3.connection import S3Connection, Bucket, Key

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)
bucket = Bucket(conn, S3_BUCKET_NAME)
k = Key(bucket = bucket, name=path_to_file)
k.delete()

4

আপডেটেড পদ্ধতিটি দেখার চেষ্টা করুন , যেহেতু বোটো 3 সময়ে সময়ে পরিবর্তিত হতে পারে। আমি আমার_বকেট.ডিলেট_বজেক্টস () ব্যবহার করেছি :

import boto3
from boto3.session import Session

session = Session(aws_access_key_id='your_key_id',
                  aws_secret_access_key='your_secret_key')

# s3_client = session.client('s3')
s3_resource = session.resource('s3')
my_bucket = s3_resource.Bucket("your_bucket_name")

response = my_bucket.delete_objects(
    Delete={
        'Objects': [
            {
                'Key': "your_file_name_key"   # the_name of_your_file
            }
        ]
    }
)


3

কোন ইন্টারফেস মাধ্যমে? আরআরএসটি ইন্টারফেস ব্যবহার করে আপনি কেবল একটি মুছুন :

DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue

এসওএপি ইন্টারফেসের মাধ্যমে :

<DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01">
  <Bucket>quotes</Bucket>
  <Key>Nelson</Key>
  <AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId>
  <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
  <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
</DeleteObject>

আপনি যদি বোটোর মতো পাইথন লাইব্রেরি ব্যবহার করেন তবে এটির মতো একটি "মুছুন" বৈশিষ্ট্যটি প্রকাশ করা উচিত delete_key()


হ্যাঁ, আমি সেই পাইথন লাইব্রেরিটি ব্যবহার করছি, তবে সেটি কি ফাইলটি মুছবে? আমি কি এইভাবে এটি করব: k.key = 'চিত্র / আনন-চিত্র / ছোট /' + ফাইলের নাম k.delete_key () এটি সঠিক? আমাকে বুঝতে দাও.
সুহাইল

@ সুহাইল: আমি সেই লাইব্রেরিটি ব্যবহার করি নি, তবে আমি যে উত্সটি সংযুক্ত করেছি তা থেকে, এটি আসলে যা করছে তা হচ্ছে DELETEআরইএসটি ইন্টারফেসের মাধ্যমে কল। সুতরাং হ্যাঁ, "মুছে ফেলা_কি" নামটি সত্ত্বেও (যা আমি স্বীকার করি অস্পষ্ট), এটি কী দ্বারা উল্লিখিত অবজেক্টটি সত্যই মুছে ফেলছে ।
টিজে ক্রাউডার

4
নামে প্রচলিত উপসর্গের সাথে প্রচুর ফাইলগুলি সরিয়ে দেওয়ার বিষয়ে কী? এস 3 কি এই জাতীয় ক্ষেত্রে কিছু বাল্ক মোছার অনুমতি দেয়, বা একে একে মুছে ফেলতে (যা ধীরে ধীরে) আবশ্যক?
ইলারিওন কোভালচুক

@ শমন: আমি কোনও এস 3 বিশেষজ্ঞ নই, তবে যতদূর আমি জানি , আপনি কেবল একটি নির্দিষ্ট ফাইল মুছতে পারেন। তবে আপনি সম্ভবত বাস্তবে এটি একটি প্রশ্ন হিসাবে জিজ্ঞাসা করতে চান যাতে এটি এস 3 বিশেষজ্ঞের দৃষ্টি আকর্ষণ করে।
টিজে ক্রাউডার

এখানে মন্তব্য করার ঠিক পরে আমি এ জাতীয় প্রশ্ন যুক্ত করেছি। এটির 2 টি বার দেখা হয়েছে :)
ইলারিওন কোভালচুক

2

এটি করার সহজ উপায় হ'ল:

import boto3
s3 = boto3.resource("s3")
bucket_source = {
            'Bucket': "my-bcuket",
            'Key': "file_path_in_bucket"
        }
s3.meta.client.delete(bucket_source)

1

আপাতত আমি লিনাক্স ইউটিলিটি এস 3 সিএমডি ব্যবহার করে সমস্যার সমাধান করেছি । আমি পাইথনে এটি ব্যবহার করেছি:

delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)

4
এস 3 (একটি লাইব্রেরি বা সরাসরি এইচটিটিপি লেনদেন আরও মার্জিত হবে) এর সাথে যোগাযোগের জন্য সাবসেলটি আহ্বান করা ঠিক অজগর নয়, তবে এটি এখনও কার্যকর। আমি মনে করি না যে এটি ডাউনটা পাওয়ার যোগ্য। +1
রেন্ডাল কুক

1

এটি চেষ্টা করার জন্য এটি আমার পক্ষে কাজ করেছে।

import boto
import sys
from boto.s3.key import Key
import boto.s3.connection

AWS_ACCESS_KEY_ID = '<access_key>'
AWS_SECRET_ACCESS_KEY = '<secret_access_key>'
Bucketname = 'bucket_name' 

conn = boto.s3.connect_to_region('us-east-2',
        aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        is_secure=True,              
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )
bucket = conn.get_bucket(Bucketname)

k = Key(bucket)

k.key = 'filename to delete'
bucket.delete_key(k)   

1

আপনি এটি আউস ক্লিপ ব্যবহার করে করতে পারেন: https://aws.amazon.com/cli/ এবং কিছু ইউনিক্স কমান্ড।

এই aws ক্লিপ কমান্ড কাজ করা উচিত:

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 

আপনি যদি সাব-ফোল্ডারগুলি অন্তর্ভুক্ত করতে চান তবে আপনার পতাকাটি - রেকর্ডিং যুক্ত করা উচিত

অথবা ইউনিক্স আদেশ সহ:

aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'

ব্যাখ্যা:

  1. বালতি - পাইপ -> এ সমস্ত ফাইল তালিকাভুক্ত করুন
  2. চতুর্থ প্যারামিটার (এটির ফাইলের নাম) - পাইপ -> // পান আপনার প্যাটার্নটি মেলে আপনি এটি লিনাক্স কমান্ড দিয়ে প্রতিস্থাপন করতে পারেন
  3. মুছে ফেলা স্ক্রিপ্ট অ্যাওস ক্লায়েন্ট দিয়ে চালান

1

আপনি যদি নিজের স্থানীয় হোস্ট কনসোল ব্যবহার করে ফাইলটি মুছে ফেলার চেষ্টা করছেন তবে আপনি সিস্টেমে আপনার অ্যাক্সেস আইডি এবং গোপন কীটি ইতিমধ্যে নির্ধারিত করে ধরে নিয়ে এই পাইথন স্ক্রিপ্টটি চালানোর চেষ্টা করতে পারেন

import boto3

#my custom sesssion
aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host")
client=aws_m.client('s3')

#list bucket objects before deleting 
response = client.list_objects(
    Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
    print(x.get("Key",None));

#delete bucket objects
response = client.delete_object(
    Bucket='your-bucket-name',
    Key='mydocs.txt'
)

#list bucket objects after deleting
response = client.list_objects(
    Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
    print(x.get("Key",None));

0

নিম্নলিখিতগুলি আমার জন্য কাজ করেছে (একটি জ্যাঙ্গো মডেলের উদাহরণের ভিত্তিতে, তবে আপনি deleteনিজের পদ্ধতিতে কোডটির ব্যবহার অনেক বেশি করতে পারেন )।

import boto3
from boto3.session import Session
from django.conf import settings

class Video(models.Model):
    title=models.CharField(max_length=500)
    description=models.TextField(default="")
    creation_date=models.DateTimeField(default=timezone.now)
    videofile=models.FileField(upload_to='videos/', null=True, verbose_name="")
    tags = TaggableManager()

    actions = ['delete']

    def __str__(self):
        return self.title + ": " + str(self.videofile)

    def delete(self, *args, **kwargs):
        session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
        s3_resource = session.resource('s3')
        s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME)

        file_path = "media/" + str(self.videofile)
        response = s3_bucket.delete_objects(
            Delete={
                'Objects': [
                    {
                        'Key': file_path
                    }
                ]
            })
        super(Video, self).delete(*args, **kwargs)

0

নীচে কোড স্নিপেট আপনি বালতি মুছতে ব্যবহার করতে পারেন,

import boto3, botocore
from botocore.exceptions import ClientError

s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
s3.Object('Bucket-Name', 'file-name as key').delete()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.