Как удалить папку и ее содержимое на Amazon S3 с помощью Python - PullRequest
0 голосов
/ 11 декабря 2019

По какой-то причине мой ответ дает только пустые квадратные скобки, т.е. [], и ничего не происходит.

Вот мой код:

session = boto3.Session(aws_access_key_id=awsaccesskey,aws_secret_access_key=awssecretkey,region_name='eu-west-1')
s3 = session.resource('s3')
b = s3.Bucket(s3bucket)
r = b.objects.filter(Prefix=s3path).delete()
return(r)

Обновление: по рекомендации Джона, которую я пытался создатьтестовое ведро, но, к сожалению, я получил ошибку «Отказано в доступе»Таким образом, вместо этого я сделал следующее:

  • Создала папку, под корзиной, к которой у меня есть доступ, с именем 'test'
  • , выполненной над кодом с префиксом = '/ test /'

На этот раз я получил объект ResponseMetadata вместо пустых скобок. Однако я все еще озадачен. Мой HTTPStatusCode равен 200. Но когда он сообщает мне, что он удалил, он говорит следующее:

  • 'Удалено': [{'Key': '/test/table_name.dat'}, {'Key': '/test/table_name.txt'‹][]]

    Полагаю, я не понимаю предполагаемую функциональность этого кода. Я ожидал, что он удалит мою пустую «тестовую» папку, которую я создал как корневую папку внутри моего контейнера. то есть bucket / test /, но вместо этого он, похоже, искал во всем моем ведре папки с именем "test" и удалил объекты внутри них ??

Ответы [ 2 ]

0 голосов
/ 12 декабря 2019

Прежде всего, есть несколько указателей: Никогда не указывайте учетные данные для доступа в клиентском объекте boto3.

В S3 нет папок. Вместо этого ключи образуют плоское пространство имен. Однако ключ с косой чертой в названии отображается в некоторых программах, в том числе в консоли AWS (см., Например, Amazon S3 boto - как создать папку?).

Вместо удаления «каталога» вы можете(и должны) перечислить файлы по префиксу и удалить. По сути:

для ключа в bucket.list (префикс = 'your / directory /'): key.delete ()

Вы можете ссылаться на эту ссылку, и один пример связан здесь: https://docs.aws.amazon.com/code-samples/latest/catalog/python-s3-delete_object.py.html

import logging
import boto3
from botocore.exceptions import ClientError

def delete_object(bucket_name, object_name):
"""Delete an object from an S3 bucket

:param bucket_name: string
:param object_name: string
:return: True if the referenced object was deleted, otherwise False
"""

# Delete the object
s3 = boto3.client('s3')
try:
    s3.delete_object(Bucket=bucket_name, Key=object_name)
except ClientError as e:
    logging.error(e)
    return False
return True
0 голосов
/ 11 декабря 2019
import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('mybucket')

for obj in my_bucket.objects.all():
    print(obj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...