我在s3中創建了一個名爲「test」的文件夾,並將「test_1.jpg」,「test_2.jpg」推入「test」。亞馬遜S3博託 - 如何刪除文件夾?
現在我想用boto刪除文件夾「test」。
我該怎麼辦?
我在s3中創建了一個名爲「test」的文件夾,並將「test_1.jpg」,「test_2.jpg」推入「test」。亞馬遜S3博託 - 如何刪除文件夾?
現在我想用boto刪除文件夾「test」。
我該怎麼辦?
在S3中有沒有文件夾。相反,這些鍵形成一個平面名稱空間。但是,某些程序(包括AWS控制檯)中的某個特定斜槓的密鑰會特別顯示(請參閱Amazon S3 boto - how to create a folder?)。
除了刪除「目錄」,您可以(並且必須)通過前綴和刪除來列出文件。實質上:
for key in bucket.list(prefix='your/directory/'):
key.delete()
但是,本頁其他已完成的答案功能更有效的方法。
請注意,只是使用虛擬字符串搜索來搜索前綴。如果前綴爲,即沒有附加斜線,程序也會高興地刪除your/directory
your/directory-that-you-wanted-to-remove-is-definitely-not-this-one
。
欲瞭解更多信息,請參閱S3 boto list keys sometimes returns directory key.
如何刪除目錄?如果此目錄中的所有文件都被刪除,該目錄將被自動刪除? – 2012-07-11 07:40:05
謝謝..我已經完成了它〜 – 2012-07-11 10:10:17
@wadehuang - 你可以分享你的關於刪除文件夾的代碼嗎? – letsc 2015-03-17 21:33:12
您可以使用bucket.delete_keys()與關鍵字的列表(用大量的密鑰,我發現這是一個數量級比使用key.delete更快)。
事情是這樣的:
delete_key_list = []
for key in bucket.list(prefix='/your/directory/'):
delete_key_list.append(key)
if len(delete_key_list) > 100:
bucket.delete_keys(delete_key_list)
delete_key_list = []
if len(delete_key_list) > 0:
bucket.delete_keys(delete_key_list)
參見Patrick的解決方案以避免N + 1請求 – deepelement 2016-01-23 18:56:26
我覺得這已經有一段時間和boto3有實現這個目標的幾個不同的方法。這是假設你要刪除的測試「文件夾」和它的所有對象這裏是單向的:
s3 = boto3.resource('s3')
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/")
delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]
s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)
這應該使兩個請求,一個獲取該文件夾中的對象,第二個要刪除所有所述文件夾中的對象。
https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects
這是迄今爲止最快的解決方案。 – deepelement 2016-01-23 18:54:58
這是最快的解決方案,但請記住'list_objects'不能返回超過1000個密鑰,因此您需要多次運行此代碼。 – lampslave 2016-04-19 11:04:11
如果您有超過1k個對象,可以使用paginator - 請參閱下面的答案。 – dmitrybelyakov 2017-04-16 11:33:11
對帕特里克的解決方案略有改善。您可能知道,list_objects()
和delete_objects()
的對象限制爲1000.這就是爲什麼您必須將塊列表和塊刪除。這是非常普遍的,你可以給Prefix
到paginator.paginate()
刪除子目錄/路徑
client = boto3.client('s3', **credentials)
paginator = client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=self.bucket_name)
delete_us = dict(Objects=[])
for item in pages.search('Contents'):
delete_us['Objects'].append(dict(Key=item['Key']))
# flush once aws limit reached
if len(delete_us['Objects']) >= 1000:
client.delete_objects(Bucket=bucket, Delete=delete_us)
delete_us = dict(Objects=[])
# flush rest
if len(delete_us['Objects']):
client.delete_objects(Bucket=bucket, Delete=delete_us)
只是一個猜測不會RM-R /測試工作? – pyCthon 2012-07-11 06:12:31