使用 Python 從來源物件 URL 複製 Blob
本文說明如何使用適用於 Python 的 Azure 儲存體用戶端程式庫,從來源物件 URL 複製 Blob。 您可以從相同儲存體帳戶內的來源、從不同儲存體帳戶中的來源,或從指定 URL 上透過 HTTP GET 要求擷取的任何可存取物件,來複製 Blob。
本文涵蓋的用戶端程式庫方法使用 Put Blob From URL 和 Put Block From URL REST API 作業。 這些方法適用於您想要將資料移至儲存體帳戶,且具有來源物件的 URL 的複製案例。 針對您想要進行非同步排程的複製作業,請參閱使用 Python 複製具有非同步排程的 Blob。
若要了解如何使用非同步 API 複製 Blob,請參閱以非同步方式從來源物件 URL 複製 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,
BlobClient,
)
授權
授權機制必須具有執行複製作業的必要權限。 如需使用 Microsoft Entra ID 授權 (建議使用),您需要 Azure RBAC 內建角色儲存體 Blob 資料參與者或更高權限。 若要深入了解,請參閱從 URL 放置 Blob (REST API) 或 從 URL 放置區塊 (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 的用戶端物件。 若要深入了解如何建立及管理用戶端物件,請參閱建立和管理與資料資源互動的用戶端端物件 (部分機器翻譯)。
關於從來源物件 URL 複製 Blob
Put Blob From URL
作業會建立新的區塊 Blob,其中 Blob 的內容會從指定的 URL 讀取。 作業會同步完成。
來源可以是透過指定 URL 上標準 HTTP GET 要求擷取的任何物件。 這包括區塊 Blob、附加 Blob、分頁 Blob、Blob 快照集、Blob 版本,或 Azure 內外的任何可存取物件。
當來源物件是區塊 Blob 時,會複製所有認可的 Blob 內容。 目的地 Blob 的內容與來源的內容相同,但不會保留已認可區塊的清單,也不會複製未認可的區塊。
目的地一律是區塊 Blob、現有的區塊 Blob,或作業所建立的新區塊 Blob。 現有 Blob 的內容會以新 Blob 的內容覆寫。
Put Blob From URL
作業一律會複製整個來源 Blob。 不支援複製特定範圍的位元組或一組區塊。 若要使用來源 URL 對區塊 Blob 的內容執行部分更新,請使用從 URL 放置區塊 API 以及 Put Block List
。
若要深入了解 Put Blob From URL
作業,包括 Blob 大小限制和計費考量事項,請參閱從 URL 放置 Blob 備註。
從來源物件 URL 複製 Blob
本節提供適用於 Python 的 Azure 儲存體用戶端程式庫提供的方法概觀,以從來源物件 URL 執行複製作業。
下列方法會包裝從 URL 放置 Blob REST API 作業,並建立新的區塊 Blob,其中 Blob 的內容會從指定的 URL 讀取:
這些方法適用於您想要將資料移至儲存體帳戶,且具有來源物件的 URL 的案例。
對於大型物件,您可以選擇使用個別區塊。 下列方法會包裝從 URL 放置區塊 REST API 作業。 這個方法會建立新的區塊,以做為從來源 URL 讀取內容的 Blob 一部分認可:
從 Azure 中的來源複製 Blob
如果您要從 Azure 內的來源複製 Blob,可以透過 Microsoft Entra ID、共用存取簽章 (SAS) 或帳戶金鑰來授權來源 Blob 的存取權。
下列範例顯示 Azure 內的來源 Blob 複製的案例。 upload_blob_from_url 方法可以選擇性地接受布林值參數,以指出是否應該覆寫現有的 Blob,如範例所示。
def copy_from_source_in_azure(self, source_blob: BlobClient, destination_blob: BlobClient):
# Get the source blob URL and create the destination blob
# set overwrite param to True if you want to overwrite existing blob data
destination_blob.upload_blob_from_url(source_url=source_blob.url, overwrite=False)
從 Azure 外部的來源複製 Blob
您可以在透過 HTTP GET 要求於指定 URL 擷取的任何來源物件上,執行複製作業,包括 Azure 外部的可存取物件。 下列範例示範從可存取的來源物件 URL 複製 Blob 的案例。
def copy_from_external_source(self, source_url: str, destination_blob: BlobClient):
# Create the destination blob from the source URL
# set overwrite param to True if you want to overwrite existing blob data
destination_blob.upload_blob_from_url(source_url=source_url, overwrite=False)
以非同步方式從來源物件 URL 複製 Blob
適用於 Python 的 Azure Blob 儲存體用戶端程式庫支援以非同步方式從來源 URL 複製 Blob。 若要深入了解專案設定需求,請參閱非同步程式設計。
請遵循下列步驟,使用非同步 API 從來源物件 URL 複製 Blob:
新增下列匯入陳述式:
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, BlobClient
新增程式碼以使用
asyncio.run
執行程式。 此函式會執行傳遞的協同程式 (在我們的範例中為main()
),並管理asyncio
事件迴圈。 協同程式會以 async/await 語法宣告。 在此範例中,main()
協同程式會先使用async with
建立最上層BlobServiceClient
,然後呼叫從來源 URL 複製 Blob 的方法。 請注意,只有最上層用戶端需要使用async with
,因為從中建立的其他用戶端會共用相同的連線集區。async def main(): sample = BlobCopySamples() # 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: # Copy a blob from one container to another in the same storage account source = blob_service_client.get_blob_client(container="source-container", blob="sample-blob.txt") destination = blob_service_client.get_blob_client(container="destination-container", blob="sample-blob.txt") await sample.copy_from_source_in_azure(source_blob=source, destination_blob=destination) if __name__ == '__main__': asyncio.run(main())
新增程式碼以從來源 URL 複製 Blob。 下列程式碼範例與同步範例相同,不同之處在於,該方法是以
async
關鍵字進行宣告,而await
關鍵字是在呼叫upload_blob_from_url
方法時使用。async def copy_from_source_in_azure(self, source_blob: BlobClient, destination_blob: BlobClient): # Get the source blob URL and create the destination blob # set overwrite param to True if you want to overwrite existing blob data await destination_blob.upload_blob_from_url(source_url=source_blob.url, overwrite=False)
完成這個基本設定後,您可以使用 async/await 語法將本文中的其他範例實作為協同程式。
資源
若要深入了解如何使用適用於 Python 的 Azure Blob 儲存體用戶端程式庫來複製 Blob,請參閱下列資源。
程式碼範例
REST API 操作
Azure SDK for Python 包含建置在 Azure REST API 之上的程式庫,可讓您透過熟悉的 Python 範例與 REST API 作業進行互動。 本文中涵蓋的用戶端程式庫方法會使用下列 REST API 作業:
- 從 URL 放置 Blob (REST API)
- Put Block From URL (REST API)
用戶端程式庫資源
相關內容
- 本文是適用於 Python 的 Blob 儲存體開發人員指南的一部分。 若要深入了解,請參閱 建置 Python 應用程式 中的開發人員指南文章完整清單。