透過 Python 刪除及還原 Blob
本文說明如何使用適用於 Python 的 Azure 儲存體用戶端程式庫刪除 Blob,以及如何在保留期間還原虛刪除的 Blob。
若要了解如何使用非同步 API 刪除 Blob,請參閱以非同步刪除 Blob。
必要條件
- Azure 訂用帳戶 - 建立免費帳戶
- Azure 儲存體帳戶 - 建立儲存體帳戶
- Python 3.8+
設定您的環境
如果沒有現有的專案,本章節會說明如何設定專案以使用適用於 Python 的 Azure Blob 儲存體用戶端程式庫。 如需詳細資訊,請參閱開始使用 Azure Blob 儲存體和 Python。
若要使用本文中的程式碼範例,請遵循下列步驟來設定您的專案。
安裝套件
使用 pip install
安裝下列套件:
pip install azure-storage-blob azure-identity
新增 import 陳述式
加入下列 import
陳述式:
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
授權
授權機制必須具有刪除 Blob 或還原虛刪除 Blob 的必要權限。 如需使用 Microsoft Entra ID 授權 (建議使用),您需要 Azure RBAC 內建角色儲存體 Blob 資料參與者或更高權限。 若要深入了解,請參閱刪除 Blob (REST API) 和取消刪除 Blob (REST API) 的授權指導。
建立用戶端物件
若要將應用程式連線至 Blob 儲存體,請建立 BlobServiceClient類別的執行個體。 下列範例示範如何使用 DefaultAzureCredential
來建立用戶端物件以進行授權:
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)
您也可以直接或從 BlobServiceClient
物件建立特定容器或 Blob 的用戶端物件。 若要深入了解如何建立及管理用戶端物件,請參閱建立和管理與資料資源互動的用戶端端物件 (部分機器翻譯)。
刪除 Blob
注意
針對儲存體帳戶啟用 Blob 虛刪除時,您無法使用用戶端程式庫方法來執行永久刪除。 使用本文中的方法,虛刪除的 Blob、Blob 版本或快照集會維持可用狀態,直到保留期間到期,此時會永久刪除。 若要深入了解基礎 REST API 作業,請參閱刪除 Blob (REST API)。
若要刪除 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:
新增下列匯入陳述式:
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient
新增程式碼以使用
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())
新增程式碼以刪除 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 作業:
用戶端程式庫資源
另請參閱
相關內容
- 本文是適用於 Python 的 Blob 儲存體開發人員指南的一部分。 若要深入了解,請參閱 建置 Python 應用程式 中的開發人員指南文章完整清單。