python - 无法在 Python 中从容器中删除多个 Blob

标签 python azure containers azure-storage azure-blob-storage

我正在尝试删除容器中的 blob。每个容器至少有 1500-2000 个 blob。每个容器包含 jpeg 文件和一个 mp4 文件。如果 mp4 文件存在,只有那时我才会删除该特定容器内的 blob。 每次当我尝试执行 content.delete_blobs(*blobsToDelete) 时,都会出现以下异常:

Exception in Non AI : Traceback (most recent call last):
  File "deleteblobs.py", line 278, in BlobsToDeleteeNonAI
    content.delete_blobs(*blobsToDelete)
  File "C:\Users\hp\AppData\Local\Programs\Python\Python38-32\lib\site-packages\azure\core\tracing\decorator.py", line 83, in wrapper_use_tracer
    return func(*args, **kwargs)
  File "C:\Users\hp\AppData\Local\Programs\Python\Python38-32\lib\site-packages\azure\storage\blob\_container_client.py", line 1194, in delete_blobs
    return self._batch_send(*reqs, **options)
  File "C:\Users\hp\AppData\Local\Programs\Python\Python38-32\lib\site-packages\azure\storage\blob\_shared\base_client.py", line 304, in _batch_send
    raise error
azure.storage.blob._shared.response_handlers.PartialBatchErrorException: There is a partial failure in the batch operation.

这是我的代码:

def BlobsToDeleteeNonAI():
        blobsToDelete = []
        #Will delete all the photos except the video.
        try:
                for containerName in NonAICandidates:
                        try:
                                mp4Found = 0
                                content = blob_service_client.get_container_client(str(containerName))
                                for blobs in content.list_blobs():
                                        print("\n"+blobs.name)
                                        #file.write("\n" +blobs.name)
                                        if(blobs.name.endswith(".jpeg")):   #str(blobs.size)
                                                blobsToDelete.append(blobs.name)

                                        if(blobs.name.endswith(".mp4")):
                                                mp4Found = 1
                                                file.write("\nMP4 File Name : " +str(blobs.name))
                                #Will only Delete if and only if the Video File is Present
                                if(mp4Found == 1):
                                        #DeleteCodeHere
                                        
                                        file.write("\n Mp4 Found : " +str(mp4Found) + " for " +str(containerName))
                                        #file.write("\n Blobs to Delete : "+str(blobsToDelete))
                                        
                                        content.delete_blobs(*blobsToDelete)
                                        blobsToDelete.clear()
                                        file.write("\n Blobs Deleted for : " +str(containerName))
                                else:
                                        file.write("\nMp4 File Not found for Non AI Candidate : " +str(containerName) + ". Cannot Perform Deletion Operation.");
                                                
                                           
                        except:
                                file.write("\nException in Non AI : " +str(traceback.format_exc()))
                                blobsToDelete.clear()
        except:
                 file.write("\nException : " +str(traceback.format_exc()))




if __name__ == "__main__":

        NonAICandidates = ['container1', 'container2', 'container3', 'container4', 'container5', 'container6', ....]


        BlobsToDeleteeNonAI()

实现过程中是否存在任何问题,或者是否存在任何其他问题阻止我删除 blob?

最佳答案

原因是单批处理只能支持 256 sub-requests 。在您的容器中,至少有 1500-2000 个 blob 需要删除,当您尝试在一个 delete_blobs 方法中删除这些 blob 时,它超出了 256 个限制。

您应该修改代码,在一个 delete_blobs 方法中,仅删除 1 到 256 个 blob。这是一个示例:

#Will only Delete if and only if the Video File is Present
if(mp4Found == 1):
    blobs_lenth=len(blobsToDelete)

    start=0
    end=256

    while end<=blobs_lenth:
         #each time, delete 256 blobs at most
         container_client.delete_blobs(*blobsToDelete[start:end])
         start = start + 256
         end = end + 256

         if start < blobs_lenth and end > blobs_lenth:
            container_client.delete_blobs(*blobsToDelete[start:blobs_lenth])

关于python - 无法在 Python 中从容器中删除多个 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64717311/

相关文章:

python - 树分类器的极高准确度指标

Python 字符串替换在 float 的打印语句中显示 0.000 #

php - 将默认值为空的非空列保留为空白时出现 MySQL 错误 1366

Azure 前门、应用服务访问限制和 AD 身份验证

containers - 使用 nat 设置 docker 容器

html - 如何对齐容器内的一个 div 而另一个对齐到浏览器窗口的右端?

c++ - vector 字符串 push_back 在 C++ 中不起作用

python:创建numpy非零索引,值对

python - 使用pyHook获取鼠标坐标稍后回放

c# - 如何使用 Microsoft.Graph 客户端库获取分配的许可证