共用方式為


透過 Python 刪除及還原 Blob

本文說明如何使用適用於 Python 的 Azure 儲存體用戶端程式庫來刪除 Blob。 如果您已啟用 Blob 的虛刪除,則可以在保留期間還原已刪除的 Blob。

若要了解如何使用非同步 API 刪除 Blob,請參閱以非同步刪除 Blob

必要條件

  • 本文假設您已有專案設定為使用適用於 Python 的 Azure Blob 儲存體用戶端程式庫。 若要了解如何設定您的專案,包括安裝套件、新增 import 陳述式,以及建立授權的用戶端物件,請參閱開始使用 Azure Blob 儲存體和 Python
  • 若要在程式代碼中使用非同步 API,請參閱非同步程式設計一節中的需求。
  • 授權機制必須具有刪除 Blob 或還原虛刪除的 Blob 的權限。 若要深入了解,請參閱下列 REST API 作業的授權指引:

刪除 Blob

若要刪除 Blob,請呼叫下列方法:

下列範例會刪除 Blob:

def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob()

如果 Blob 具有任何相關聯的快照集,您必須刪除其所有快照集,才能刪除 Blob。 下列範例會刪除 Blob 及其快照集:

def delete_blob_snapshots(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob(delete_snapshots="include")

刪除快照集,而不刪除 Blob 本身,您即可傳遞參數 delete_snapshots="only"

還原已刪除的 Blob

Blob 虛刪除可保護個別的 Blob 及其版本、快照集和中繼資料,將刪除的資料保留在系統中一段指定時間,避免不小心刪除或覆寫資料。 在保留期間內,您可以在刪除時將 Blob 還原至其狀態。 保留期限到期後,即會永久刪除該 Blob。 如需關於 Blob 虛刪除的詳細資訊,請參閱 Blob 的虛刪除

您可以使用 Azure 儲存體用戶端程式庫來還原已虛刪除的 Blob 或快照集。

還原虛刪除 Blob 的方式,取決於您的儲存體帳戶是否已啟用 Blob 版本設定。 如需 Blob 版本設定的詳細資訊,請參閱 Blob 版本設定。 視您的情節而定,請參閱下列其中一個區段:

在停用版本控制時還原虛刪除的物件

若要在停用版本設定時還原已刪除的 Blob,請呼叫下列方法:

此方法會還原虛刪除 Blob 的內容和中繼資料,以及任何相關聯的虛刪除快照集。 針對未刪除的 Blob 呼叫這個方法,不會有任何作用。

def restore_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.undelete_blob()

在停用版本設定時,還原虛刪除的物件

若儲存體帳戶設定為啟用 Blob 版本設定,則刪除 Blob 會導致目前版本的 Blob 變成舊版。 若要在啟用版本設定時還原已虛刪除的 Blob,請透過基底 Blob 複製舊版。 您可以使用下列方法:

下列程式碼範例會取得已刪除 Blob 的最新版本,並將它複製到基底 Blob 來還原最新版本:

def restore_blob_version(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)

    # Get a reference to the soft-deleted base blob and list all the blob versions
    blob_client = container_client.get_blob_client(blob=blob_name)
    blob_list = container_client.list_blobs(name_starts_with=blob_name, include=['deleted','versions'])
    blob_versions = []
    for blob in blob_list:
        blob_versions.append(blob.version_id)
    
    # Get the latest version of the soft-deleted blob
    blob_versions.sort(reverse=True)
    latest_version = blob_versions[0]

    # Build the blob URI and add the version ID as a query string
    versioned_blob_url = f"{blob_client.url}?versionId={latest_version}"

    # Restore the latest version by copying it to the base blob
    blob_client.start_copy_from_url(versioned_blob_url)

非同步方式刪除 Blob

適用於 Python 的 Azure Blob 儲存體用戶端程式庫支援以非同步方式刪除 Blob。 若要深入了解專案設定需求,請參閱非同步程式設計

依照下列步驟,使用非同步 API 刪除 Blob:

  1. 新增下列匯入陳述式:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient
    
  2. 新增程式碼以使用 asyncio.run 執行程式。 此函式會執行傳遞的協同程式 (在我們的範例中為 main()),並管理 asyncio 事件迴圈。 協同程式會以 async/await 語法宣告。 在此範例中,main() 協同程式會先使用 async with 建立最上層 BlobServiceClient,然後呼叫刪除 Blob 的方法。 請注意,只有最上層用戶端需要使用 async with,因為從中建立的其他用戶端會共用相同的連線集區。

    async def main():
        sample = BlobSamples()
    
        # TODO: Replace <storage-account-name> with your actual storage account name
        account_url = "https://<storage-account-name>.blob.core.windows.net"
        credential = DefaultAzureCredential()
    
        async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
            await sample.delete_blob(blob_service_client, "sample-container", "sample-blob.txt")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. 新增程式碼以刪除 Blob。 該程式碼與同步範例相同,不同之處在於該方法是以 async 關鍵字宣告的,而 await 關鍵字是在呼叫 delete_blob 方法時使用的。

    async def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
        await blob_client.delete_blob()
    

完成這個基本設定後,您可以使用 async/await 語法,將本文中的其他範例實作為協同程式。

資源

若要深入了解如何使用適用於 Python 的 Azure Blob 儲存體用戶端程式庫來刪除 Blob 和還原已刪除的 Blob,請參閱下列資源。

REST API 操作

Azure SDK for Python 包含建置在 Azure REST API 之上的程式庫,可讓您透過熟悉的 Python 範例與 REST API 作業進行互動。 用來刪除 Blob 和還原已刪除 Blob 的用戶端程式庫方法會使用下列 REST API 作業:

程式碼範例

用戶端程式庫資源

另請參閱