アマゾンs3バケットからファイルを削除する方法は?


91

Amazons3バケットから必要なファイルを削除するコードをPythonで作成する必要があります。Amazon s3バケットに接続し、ファイルを保存することもできますが、ファイルを削除するにはどうすればよいですか?


S3サポートに使用しているPythonライブラリ(ある場合)はどれですか?または、PythonコードのRESTまたはSOAPインターフェースに直接アクセスしますか?
TJ Crowder 2010年

1
私はPythonライブラリboto.s3を使用しています
Suhail

回答:


94

を使用してboto3(現在はバージョン1.4.4)を使用しますS3.Object.delete()

import boto3

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

1
オブジェクトが存在しない場合、エラーがスローされますか?
AkashTantri19年

2
@AkashTantri個人的に試したことはありませんが、ドキュメントにはnullバージョンが削除されると書かれています(存在する場合)[...] nullバージョンがない場合、AmazonS3はオブジェクトを削除しません。だから私の推測では、それはエラーをスローしないでしょう。もしあなたがそれを試してみたら(ただ何かをs3.Object('existing-bucket', 'bogus-key').delete()して何が起こるか見てください。また試してみてくださいs3.Object('bogus-bucket', 'bogus-key').delete()
KohányiRóbert19年

魅力、ザッツのpythonの本当の力のように動作します
ユヌス

@yunusこれは深刻なコメントですか?
ヘンリーヘンリンソン

your-key、ここで実際のファイル名を意味your-bucketS3上の?
Underoos

91

botoを使用してそれを行うもう1つの方法を見つけました:

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()
Artur Sapek 2013

提示されるような作業にこのコードスニペットのために、あなたは、インポートする必要がありますBucketし、Keyあまりにも、。のように:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas 2014

私は、GET >>> 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.connectionboto3への答えを更新してください
ハリー・モレノ

1
それを理解し、解決策を書きましたharrymoreno.com/2017/04/24/…–
ハリーモレノ

74

Python boto3 SDKを使用して(そしてAWSの認証情報が設定されていると仮定して)、以下はバケット内の指定されたオブジェクトを削除します。

import boto3

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

6
@ Robboto3のドキュメントは誤解を招く恐れがあります。オブジェクトがバージョン管理されている場合は、削除マーカーが作成されます。それ以外の場合はオブジェクトを削除します。
jarmod

1
清潔でシンプル。受け入れられた答えである可能性があり、両方がタスクの最良のアプローチであるため、@KohányiRóbertの答えと確実にマージする必要があります。
PaulB

15

2020年へようこそここにPython / Djangoの答えがあります:

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

答えを見つけるのに時間がかかりすぎて、これと同じくらい簡単でした。


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

Boto3は時々変更される可能性があるため、更新されたメソッドを探してみてください。my_bucket.delete_objects()を使用しました

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

どのインターフェースを介して?RESTインターフェースを使用して、削除を送信するだけです。

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

SOAPインターフェース経由:

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

botoのようなPythonライブラリを使用している場合は、のような「削除」機能を公開する必要がありdelete_key()ます。


はい、私はそのpythonライブラリを使用していますが、ファイルは削除されますか?この方法で行う必要があります:k.key = 'images / anon-images / small /' + filename k.delete_key()これは正しいですか?私にお知らせください。
スハイル2010年

@Suhail:私はそのライブラリを使用していませんが、リンクしたソースから、実際に実行しているのはDELETE、RESTインターフェイスを介した呼び出しです。そうです、「delete_key」という名前(私は同意しますが不明確です)にもかかわらず、それは実際にはキーによって参照されているオブジェクトを削除しています。
TJ Crowder 2010年

1
名前に共通のプレフィックスが付いている多くのファイルを削除するのはどうですか?S3はそのような場合にいくつかの一括削除を許可しますか、それともそれらを1つずつ削除する(遅い)必要がありますか?
Illarion Kovalchuk 2010

@Shaman:私はS3の専門家ではありませんが、私が知る限り、削除できるのは特定のファイルのみです。しかし、S3の専門家から注目を集めるために、実際に質問として質問したいと思うかもしれません。
TJ Crowder 2010

ここにコメントした直後に、そのような質問を追加しました。まだ2つのビューがあります:)
Illarion Kovalchuk

2

これを行う最も簡単な方法は次のとおりです。

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

1

今のところ、Linuxユーティリティs3cmdを使用して問題を解決しました。私はPythonで次のように使用しました:

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

1
S3と通信するためにサブシェルを呼び出すことは厳密にはpythonicではありませんが(ライブラリまたは直接HTTPトランザクションの方が洗練されています)、それでも機能します。私はそれが反対票に値するとは思わない。+1。
Randall Cook

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

aws cliを使用してそれを行うことができます:https//aws.amazon.com/cli/といくつかのunixコマンド。

このawscliコマンドは機能するはずです:

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

サブフォルダを含める場合は、フラグ--recursiveを追加する必要があります

またはunixコマンドを使用する場合:

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. バケット上のすべてのファイルを一覧表示します--pipe->
  2. 4番目のパラメーター(ファイル名)を取得します--pipe-> //パターンに一致するようにlinuxコマンドに置き換えることができます
  3. awscliで削除スクリプトを実行する

1

独自のローカルホストコンソールを使用してファイルを削除しようとしている場合は、システムでアクセスIDと秘密鍵がすでに割り当てられていることを前提として、このpythonスクリプトを実行してみてください。

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

以下は私のために働きました(Djangoモデルの例に基づいていますが、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.