Amazon S3 boto - 폴더를 삭제하는 방법?
저는 s3에 "test"라는 폴더를 만들고 "test_1.jpg", "test_2.jpg"를 "test"로 밀어넣었습니다.
boto를 사용하여 "test" 폴더를 삭제하려면 어떻게 해야 합니까?
다음은 2018년(거의 2019년) 버전입니다.
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.objects.filter(Prefix="myprefix/").delete()
S3에 폴더가 없습니다.대신 키는 평평한 네임스페이스를 형성합니다.그러나 이름에 슬래시가 있는 키는 AWS 콘솔을 포함한 일부 프로그램에서 특히 표시됩니다(예: Amazon S3 boto - 폴더 생성 방법 참조).
디렉토리를 삭제하는 대신 접두사와 삭제로 파일을 나열할 수 있습니다.본질적으로:
for key in bucket.list(prefix='your/directory/'):
key.delete()
그러나 이 페이지의 다른 성공적인 답변은 더 효율적인 접근 방식을 제공합니다.
접두사는 더미 문자열 검색을 사용하여 검색됩니다.접두사가 , 즉, 후행 슬래시가 추가되지 않은 경우, 프로그램은 또한 기꺼이 삭제할 것입니다.your/directory-that-you-wanted-to-remove-is-definitely-not-this-one.
자세한 내용은 S3 boto 목록 키를 참조하여 디렉토리 키를 반환할 수 있습니다.
저는 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
패트릭의 해결책에 대한 약간의 개선.아시다시피, 둘 다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)
키 목록과 함께 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)
S3 버킷에서 버전 관리가 활성화된 경우:
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.object_versions.filter(Prefix="myprefix/").delete()
만약 나처럼 객체 내용을 기준으로 필터링해야 한다면, 당신의 논리에 대한 청사진은 다음과 같습니다.
def get_s3_objects_batches(s3: S3Client, **base_kwargs):
kwargs = dict(MaxKeys=1000, **base_kwargs)
while True:
response = s3.list_objects_v2(**kwargs)
# to yield each and every file: yield from response.get('Contents', [])
yield response.get('Contents', [])
if not response.get('IsTruncated'): # At the end of the list?
break
continuation_token = response.get('NextContinuationToken')
kwargs['ContinuationToken'] = continuation_token
def your_filter(b):
raise NotImplementedError()
session = boto3.session.Session(profile_name=profile_name)
s3client = session.client('s3')
for batch in get_s3_objects_batches(s3client, Bucket=bucket_name, Prefix=prefix):
to_delete = [{'Key': obj['Key']} for obj in batch if your_filter(obj)]
if to_delete:
s3client.delete_objects(Bucket=bucket_name, Delete={'Objects': to_delete})
#boto3#을 사용하여 폴더 S3 내의 파일 삭제
def delete_from_minio():
"""
This function is used to delete files or folder inside the another Folder
"""
try:
logger.info("Deleting from minio")
aws_access_key_id='Your_aws_acess_key'
aws_secret_access_key = 'Your_aws_Secret_key'
host = 'your_aws_endpoint'
s3 = boto3.resource('s3', aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key ,
config=boto3.session.Config(signature_version='your_version'),
region_name="your_region",
endpoint_url=host ,
verify=False)
bucket = s3.Bucket('Your_bucket_name')
for obj in bucket.objects.filter(Prefix='Directory/Sub_Directory'):
s3.Object(bucket.name, obj.key).delete()
except Exception as e:
print(f"Error Occurred while deleting from the S3,{str(e)}")
이것이 도움이 되길 바랍니다 :)
언급URL : https://stackoverflow.com/questions/11426560/amazon-s3-boto-how-to-delete-folder
'programing' 카테고리의 다른 글
| openpyxl을 사용하여 .xlsx 시트에 있는 행과 열의 수를 가져오는 방법이 있습니까? (0) | 2023.08.12 |
|---|---|
| Oracle 날짜를 문자열로 변환 (0) | 2023.08.12 |
| CSS: 창 너비의 50%에 해당하는 배경색을 설정합니다. (0) | 2023.08.12 |
| 누적 정규 분포를 계산하는 방법은 무엇입니까? (0) | 2023.08.12 |
| Chocolaty 설치 경로는 어디입니까? (0) | 2023.08.12 |