2015-10-13 143 views
4

我在我的s3存儲桶'test'中有一個目錄,我想刪除這個目錄。 這是我在做什麼Boto3,s3文件夾沒有被刪除

s3 = boto3.resource('s3') 
s3.Object(S3Bucket,'test').delete() 

像這樣

{ 'ResponseMetadata' 獲得響應:{ 'HTTPStatusCode':204, '主機標識': 「****** ******'''RequestId':'**********'}}

但我的目錄沒有被刪除!

我嘗試了'/ test','test /'和'/ test /'等所有組合,並且在該目錄內的文件和空目錄下嘗試,並且都未能刪除'test'。

+0

什麼是'S3Bucket'? 's3.Object()'返回一個鍵對象。你不只是需要's3.Bucket('test')。delete()'? – AChampion

+0

S3Bucket是我的s3存儲桶名稱 – MikA

+1

然後我誤解你的目錄是什麼意思,沒有像目錄,只有存儲桶和對象(鍵)這樣的東西。對象名稱可以具有結構,例如'/ this/is/my/object',但是'/ this/is/my'不獨立於對象。你如何測試存在? – AChampion

回答

11

注意:請參閱Daniel Levinson的回答,以獲取更有效的刪除多個對象的方法。


在S3中,沒有目錄,只有鍵。如果密鑰名稱包含/(如prefix/my-key.txt),則AWS控制檯會將所有共享此前綴的密鑰分組在一起,以方便起見。

要刪除一個「目錄」,您必須找到所有名稱以目錄名開頭的密鑰並單獨刪除每個密鑰。幸運的是,boto3提供了一個過濾函數來僅返回以特定字符串開頭的鍵。所以你可以這樣做:

s3 = boto3.resource('s3') 
bucket = s3.Bucket('my-bucket-name') 
for obj in bucket.objects.filter(Prefix='test/'): 
    s3.Object(bucket.name, obj.key).delete() 
18

delete_objects使您能夠使用單個HTTP請求從存儲桶中刪除多個對象。您最多可以指定1000個密鑰。

https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.delete_objects

import boto3 

s3 = boto3.resource('s3') 
bucket = s3.Bucket('my-bucket') 

objects_to_delete = [] 
for obj in bucket.objects.filter(Prefix='test/'): 
    objects_to_delete.append({'Key': obj.key}) 

bucket.delete_objects(
    Delete={ 
     'Objects': objects_to_delete 
    } 
) 
+3

這應該是接受的答案,因爲它比來自David Morales – baldr

+0

'objects_to_delete = [{'Key':obj.key} for obj in bucket.objects.filter(Prefix ='test',Marker ='test/path /到/ DIR')]' – colllin