Copiar um blob de uma URL de objeto de origem com Python
Este artigo mostra como copiar um blob de uma URL de objeto de origem usando a biblioteca de cliente do Armazenamento do Azure para Python. Você pode copiar um blob de uma fonte dentro da mesma conta de armazenamento, de uma fonte em uma conta de armazenamento diferente ou de qualquer objeto acessível recuperado via solicitação HTTP GET em uma determinada URL.
Os métodos de biblioteca de cliente abordados neste artigo usam as operações Put Blob From URL e Put Block From URL REST API. Esses métodos são preferidos para cenários de cópia em que você deseja mover dados para uma conta de armazenamento e ter uma URL para o objeto de origem. Para operações de cópia em que você deseja agendamento assíncrono, consulte Copiar um blob com agendamento assíncrono usando Python.
Para saber mais sobre como copiar blobs usando APIs assíncronas, consulte Copiar um blob de uma URL de objeto de origem de forma assíncrona.
Pré-requisitos
- Subscrição do Azure - crie uma gratuitamente
- Conta de armazenamento do Azure - criar uma conta de armazenamento
- Python 3.8+
Configurar o ambiente
Se você não tiver um projeto existente, esta seção mostra como configurar um projeto para trabalhar com a biblioteca de cliente do Armazenamento de Blobs do Azure para Python. Para obter mais detalhes, consulte Introdução ao Armazenamento de Blobs do Azure e Python.
Para trabalhar com os exemplos de código neste artigo, siga estas etapas para configurar seu projeto.
Instalar pacotes
Instale os seguintes pacotes usando pip install
:
pip install azure-storage-blob azure-identity
Adicionar instruções de importação
Adicione as seguintes instruções import
:
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
BlobServiceClient,
BlobClient,
)
Autorização
O mecanismo de autorização deve ter as permissões necessárias para executar uma operação de cópia. Para autorização com o Microsoft Entra ID (recomendado), você precisa da função interna do RBAC do Azure RBAC Storage Blob Data Contributor ou superior. Para saber mais, consulte as diretrizes de autorização para Put Blob From URL (REST API) ou Put Block From URL (REST API).
Criar um objeto cliente
Para conectar um aplicativo ao Armazenamento de Blob, crie uma instância de BlobServiceClient. O exemplo a seguir mostra como criar um objeto cliente usando DefaultAzureCredential
para autorização:
# 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)
Você também pode criar objetos de cliente para contêineres ou blobs específicos, diretamente ou a partir do BlobServiceClient
objeto. Para saber mais sobre como criar e gerenciar objetos de cliente, consulte Criar e gerenciar objetos de cliente que interagem com recursos de dados.
Sobre a cópia de blobs de uma URL de objeto de origem
A Put Blob From URL
operação cria um novo blob de bloco onde o conteúdo do blob é lido de uma determinada URL. A operação é concluída de forma síncrona.
A fonte pode ser qualquer objeto recuperável através de uma solicitação HTTP GET padrão na URL fornecida. Isso inclui blobs de bloco, blobs de acréscimo, blobs de página, instantâneos de blob, versões de blob ou qualquer objeto acessível dentro ou fora do Azure.
Quando o objeto de origem é um blob de bloco, todo o conteúdo de blob confirmado é copiado. O conteúdo do blob de destino é idêntico ao conteúdo da origem, mas a lista de blocos confirmados não é preservada e os blocos não confirmados não são copiados.
O destino é sempre um blob de bloco, um blob de bloco existente ou um novo blob de bloco criado pela operação. O conteúdo de um blob existente é substituído pelo conteúdo do novo blob.
A Put Blob From URL
operação sempre copia todo o blob de origem. Não há suporte para copiar um intervalo de bytes ou um conjunto de blocos. Para executar atualizações parciais no conteúdo de um blob de bloco usando uma URL de origem, use a API Put Block From URL junto com Put Block List
.
Para saber mais sobre a operação, incluindo limitações de tamanho de Put Blob From URL
blob e considerações de cobrança, consulte Colocar Blob a partir de observações de URL.
Copiar um blob de uma URL de objeto de origem
Esta seção fornece uma visão geral dos métodos fornecidos pela biblioteca de cliente do Armazenamento do Azure para Python executar uma operação de cópia de uma URL de objeto de origem.
O método a seguir encapsula a operação Put Blob From URL REST API e cria um novo blob de bloco onde o conteúdo do blob é lido de uma determinada URL:
Esses métodos são preferidos para cenários em que você deseja mover dados para uma conta de armazenamento e ter uma URL para o objeto de origem.
Para objetos grandes, você pode optar por trabalhar com blocos individuais. O método a seguir encapsula a operação Put Block From URL REST API. Esse método cria um novo bloco a ser confirmado como parte de um blob onde o conteúdo é lido de uma URL de origem:
Copiar um blob de uma fonte no Azure
Se estiver a copiar um blob de uma origem no Azure, o acesso ao blob de origem pode ser autorizado através do Microsoft Entra ID, de uma assinatura de acesso partilhado (SAS) ou de uma chave de conta.
O exemplo a seguir mostra um cenário para copiar um blob de origem no Azure. O método upload_blob_from_url pode opcionalmente aceitar um parâmetro booleano para indicar se um blob existente deve ser substituído, como mostrado no exemplo.
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)
Copiar um blob de uma fonte fora do Azure
Você pode executar uma operação de cópia em qualquer objeto de origem que possa ser recuperado por meio da solicitação HTTP GET em uma determinada URL, incluindo objetos acessíveis fora do Azure. O exemplo a seguir mostra um cenário para copiar um blob de uma URL de objeto de origem acessível.
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)
Copiar um blob de uma URL de objeto de origem de forma assíncrona
A biblioteca de cliente do Armazenamento de Blobs do Azure para Python dá suporte à cópia assíncrona de um blob de uma URL de origem. Para saber mais sobre os requisitos de configuração do projeto, consulte Programação assíncrona.
Siga estas etapas para copiar um blob de uma URL de objeto de origem usando APIs assíncronas:
Adicione as seguintes instruções de importação:
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, BlobClient
Adicione código para executar o programa usando
asyncio.run
o . Essa função executa a co-rotina passada,main()
em nosso exemplo, e gerencia o loop deasyncio
eventos. As co-rotinas são declaradas com a sintaxe async/await. Neste exemplo, amain()
co-rotina primeiro cria o nívelBlobServiceClient
superior usandoasync with
e, em seguida, chama o método que copia um blob de uma URL de origem. Observe que apenas o cliente de nível superior precisa usarasync with
o , pois outros clientes criados a partir dele compartilham o mesmo pool de conexões.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())
Adicione código para copiar um blob de um URL de origem. O exemplo de código a seguir é o mesmo que o exemplo síncrono, exceto que o método é declarado com a
async
palavra-chave e aawait
palavra-chave é usada ao chamar oupload_blob_from_url
método.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)
Com essa configuração básica em vigor, você pode implementar outros exemplos neste artigo como co-rotinas usando a sintaxe async/await.
Recursos
Para saber mais sobre como copiar blobs usando a biblioteca de cliente do Armazenamento de Blobs do Azure para Python, consulte os recursos a seguir.
Amostras de código
- Exibir exemplos de código síncrono ou assíncrono deste artigo (GitHub)
Operações da API REST
O SDK do Azure para Python contém bibliotecas que se baseiam na API REST do Azure, permitindo que você interaja com operações da API REST por meio de paradigmas Python familiares. Os métodos de biblioteca de cliente abordados neste artigo usam as seguintes operações de API REST:
- Colocar Blob da URL (API REST)
- Colocar bloco de URL (API REST)
Recursos da biblioteca do cliente
Conteúdos relacionados
- Este artigo faz parte do guia do desenvolvedor do Blob Storage para Python. Para saber mais, consulte a lista completa de artigos do guia do desenvolvedor em Build your Python app.