Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 无法从版本控制的s3存储桶中删除项_Python 3.x_Amazon Web Services_Amazon S3 - Fatal编程技术网

Python 3.x 无法从版本控制的s3存储桶中删除项

Python 3.x 无法从版本控制的s3存储桶中删除项,python-3.x,amazon-web-services,amazon-s3,Python 3.x,Amazon Web Services,Amazon S3,我正在尝试从s3存储桶中删除特定的.jpg文件。我尝试过许多不同的方法,比如delete\u object和其他几个堆栈溢出的答案。它们都没有正常工作,导致程序崩溃,每次都有不同的退出代码。下面的代码不会使程序崩溃,但bucket保持不变。有人知道如何解决这个问题吗 s3=boto3.resource('s3')) s3.对象('my-bucket','label_file')。删除() 打印呼叫响应时,这是打印到终端的消息 { “ResponseMetadata”:{ “请求ID”:“FJ

我正在尝试从s3存储桶中删除特定的
.jpg
文件。我尝试过许多不同的方法,比如
delete\u object
和其他几个堆栈溢出的答案。它们都没有正常工作,导致程序崩溃,每次都有不同的退出代码。下面的代码不会使程序崩溃,但bucket保持不变。有人知道如何解决这个问题吗

s3=boto3.resource('s3'))
s3.对象('my-bucket','label_file')。删除()
打印呼叫响应时,这是打印到终端的消息


{
“ResponseMetadata”:{
“请求ID”:“FJEOSIJFIO2J31”,
“主机ID”:“VEt+tpQ+DSAW5UTx/+KGME0JX43345LX2ULHMDSDRKYE1PSTA3EO=”,
“HTTPStatusCode”:314,
“HTTPHeaders”:{
“x-amz-id-2”:“VEt+tpQo2DAS6z+m8o3215UTx/+KGME0JX2DSI3ULHMDRKYEVPSTA3EO=”,
“x-amz-request-id”:“T255WdZ732sVDWJF”,
“日期”:“2021年4月7日星期三19:28:04 GMT”,
“x-amz-version-id”:“4gi8EtDS27ZNy221tkziO”,
“x-amz-delete-MAKER':“true”,
“服务器”:“AmazonS3”
},
“RetryAttempts”:0
},
“DeleteMarker”:True,
“VersionId”:“4gioU7FD36t5hcX21IOtkziO”
}

您的S3存储桶已启用版本控制,因为您有:

      'x-amz-delete-marker': 'true',
   ...
   'DeleteMarker': True,
在回答中

AmazonS3中的删除标记是 在简单删除请求中命名的受版本控制的对象。因为 该对象位于启用版本控制的存储桶中,而该对象不在存储桶中 删除。但是delete标记使amazons3的行为就像它是 删除

因此,基本上,您必须删除标记,然后删除文件

如果要删除删除标记,它必须具有版本ID,并且 必须在删除对象版本ID请求中指定该ID。如果你 使用删除请求删除删除标记(不指定 删除标记的版本ID),Amazon S3不会删除删除标记 标记,但插入另一个删除标记

要删除删除标记和版本化文件,可以使用以下代码:

警告!这将有效地清除你的桶

def删除版本(目标存储桶:str)->无:
s3=boto3.resource(“s3”,region\u name=“您的s3\u bucket\u region\u goes\u here”)
桶=s3.桶(目标桶)
object\u version\u iterator=bucket.object\u versions.all()
对于对象版本迭代器中的对象版本:
key=object\u version.object\u key
object\u id=object\u version.id
打印(f“删除id为{object_id}的键:{key}”)
object_version.delete()
打印(f“完成{target_bucket}已清除。”)

您也可以删除单个对象版本

导入boto3
bucket_name=“mybucket”
objects_to_delete=['label_file','label_file1']
bucket=boto3.resource('s3')。bucket(bucket\u名称)
versions=bucket.object\u versions.all()
#如果你想全部删除,删除支票就足够了
对于版本中的版本:
如果version.object\输入要删除的对象:
version.delete()
如果需要,还可以使用
filter

object\u summary\u迭代器=bucket.objects.filter(
分隔符=“字符串”,
EncodingType='url',
Marker='string',
MaxKeys=123,
前缀='string',
RequestPayer='requester',
预期BucketOwner='string'
)
这里还有一个很好的例子