Python ile blob indirme
Bu makalede, Python için Azure Depolama istemci kitaplığını kullanarak blob indirme işlemi gösterilmektedir. Blob verilerini yerel dosya yolu, akış veya metin dizesi gibi çeşitli hedeflere indirebilirsiniz. Ayrıca blob akışını açabilir ve buradan okuyabilirsiniz.
Zaman uyumsuz API'leri kullanarak blob indirme hakkında bilgi edinmek için bkz . Blobları zaman uyumsuz olarak indirme.
Önkoşullar
- Azure aboneliği - ücretsiz bir abonelik oluşturun
- Azure depolama hesabı - depolama hesabı oluşturma
- Python 3.8+
Ortamınızı ayarlama
Mevcut bir projeniz yoksa, bu bölümde Python için Azure Blob Depolama istemci kitaplığıyla çalışmak üzere bir projenin nasıl ayarlanacağı gösterilir. Diğer ayrıntılar için bkz. Azure Blob Depolama ve Python'ı kullanmaya başlama.
Bu makaledeki kod örnekleriyle çalışmak için projenizi ayarlamak için bu adımları izleyin.
Paketleri yükleme
kullanarak pip install
aşağıdaki paketleri yükleyin:
pip install azure-storage-blob azure-identity
İçeri aktarma deyimleri ekleme
Aşağıdaki import
deyimlerini ekleyin:
import io
import os
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobClient
Yetkilendirme
Yetkilendirme mekanizması, indirme işlemini gerçekleştirmek için gerekli izinlere sahip olmalıdır. Microsoft Entra Id ile yetkilendirme için (önerilen), Azure RBAC yerleşik rolü Depolama Blob Veri Okuyucusu veya üzeri gerekir. Daha fazla bilgi edinmek için Bkz. Blob Alma (REST API) için yetkilendirme kılavuzu.
İstemci nesnesi oluşturma
Bir uygulamayı Blob Depolama'ya bağlamak için bir BlobServiceClient örneği oluşturun. Aşağıdaki örnekte yetkilendirme için kullanarak DefaultAzureCredential
bir istemci nesnesinin nasıl oluşturulacağı gösterilmektedir:
# 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)
Ayrıca, doğrudan veya nesneden BlobServiceClient
belirli kapsayıcılar veya bloblar için istemci nesneleri oluşturabilirsiniz. İstemci nesneleri oluşturma ve yönetme hakkında daha fazla bilgi edinmek için bkz . Veri kaynaklarıyla etkileşim kuran istemci nesneleri oluşturma ve yönetme.
Blobu indirme
Blobu indirmek için aşağıdaki yöntemi kullanabilirsiniz:
download_blob
yöntemi bir StorageStreamDownloader nesnesi döndürür. İndirme sırasında istemci kitaplıkları indirme isteğini öbeklere böler ve burada her öbek ayrı bir Blob Al aralığı isteğiyle indirilir. Bu davranış, blobun toplam boyutuna ve veri aktarımı seçeneklerinin nasıl ayarlandığına bağlıdır.
Dosya yoluna indirme
Aşağıdaki örnek bir blobu dosya yoluna indirir:
def download_blob_to_file(self, blob_service_client: BlobServiceClient, container_name):
blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
with open(file=os.path.join(r'filepath', 'filename'), mode="wb") as sample_blob:
download_stream = blob_client.download_blob()
sample_blob.write(download_stream.readall())
Akışa indirme
Aşağıdaki örnek bir blobu bir akışa indirir. Bu örnekte StorageStreamDownloader.read_into blob içeriğini bir akışa indirir ve okunan bayt sayısını döndürür:
def download_blob_to_stream(self, blob_service_client: BlobServiceClient, container_name):
blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
# readinto() downloads the blob contents to a stream and returns the number of bytes read
stream = io.BytesIO()
num_bytes = blob_client.download_blob().readinto(stream)
print(f"Number of bytes: {num_bytes}")
Öbekler halinde blob indirme
Aşağıdaki örnek bir blob indirir ve indirme akışındaki öbekler üzerinde yinelenir. Bu örnekte StorageStreamDownloader.chunks, blob içeriğini öbekler halinde okumanızı sağlayan bir yineleyici döndürür:
def download_blob_chunks(self, blob_service_client: BlobServiceClient, container_name):
blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
# This returns a StorageStreamDownloader
stream = blob_client.download_blob()
chunk_list = []
# Read data in chunks to avoid loading all into memory at once
for chunk in stream.chunks():
# Process your data (anything can be done here - 'chunk' is a byte array)
chunk_list.append(chunk)
Dizeye indirme
Aşağıdaki örnekte blob içeriği metin olarak indirilir. Bu örnekte parametresinin encoding
bir dize döndürmesi gerekir readall()
, aksi takdirde bayt döndürür:
def download_blob_to_string(self, blob_service_client: BlobServiceClient, container_name):
blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
# encoding param is necessary for readall() to return str, otherwise it returns bytes
downloader = blob_client.download_blob(max_concurrency=1, encoding='UTF-8')
blob_text = downloader.readall()
print(f"Blob contents: {blob_text}")
Yapılandırma seçenekleriyle blok blobu indirme
Blob indirirken istemci kitaplığı yapılandırma seçeneklerini tanımlayabilirsiniz. Bu seçenekler performansı geliştirmek ve güvenilirliği artırmak için ayarlanabilir. Aşağıdaki kod örneklerinde, blobclient örneği oluştururken hem yöntem düzeyinde hem de istemci düzeyinde indirme için yapılandırma seçeneklerinin nasıl tanımlanacağı gösterilmektedir. Bu seçenekler bir ContainerClient örneği veya BlobServiceClient örneği için de yapılandırılabilir.
İndirmede veri aktarımı seçeneklerini belirtme
Veri aktarımı işlemlerinin performansını iyileştirmek için istemci örneği oluştururken yapılandırma seçeneklerini ayarlayabilirsiniz. Python'da bir istemci nesnesi oluştururken aşağıdaki anahtar sözcük bağımsız değişkenlerini geçirebilirsiniz:
max_chunk_get_size
- Blob indirmek için kullanılan en büyük öbek boyutu. Varsayılan değer 4 MiB'dir.max_single_get_size
- Tek bir çağrıda indirilecek blob için maksimum boyut. Toplam blob boyutu değerini aşarsamax_single_get_size
blob verilerinin geri kalanı öbekler halinde indirilir. Varsayılan değer 32 MiB'dir.
İndirme işlemleri için, download_blob çağırırken bağımsız değişkeni de geçirebilirsinizmax_concurrency
. Bu bağımsız değişken, indirme işlemi için en fazla paralel bağlantı sayısını tanımlar.
Aşağıdaki kod örneği, nesne BlobClient
oluştururken veri aktarımı seçeneklerini belirtmeyi ve bu istemci nesnesini kullanarak verileri indirmeyi gösterir. Bu örnekte sağlanan değerler bir öneri olarak tasarlanmamıştır. Bu değerleri düzgün ayarlamak için uygulamanızın belirli gereksinimlerini dikkate almanız gerekir.
def download_blob_transfer_options(self, account_url: str, container_name: str, blob_name: str):
# Create a BlobClient object with data transfer options for download
blob_client = BlobClient(
account_url=account_url,
container_name=container_name,
blob_name=blob_name,
credential=DefaultAzureCredential(),
max_single_get_size=1024*1024*32, # 32 MiB
max_chunk_get_size=1024*1024*4 # 4 MiB
)
with open(file=os.path.join(r'file_path', 'file_name'), mode="wb") as sample_blob:
download_stream = blob_client.download_blob(max_concurrency=2)
sample_blob.write(download_stream.readall())
Blobları zaman uyumsuz olarak indirme
Python için Azure Blob Depolama istemci kitaplığı, blobların zaman uyumsuz olarak indirilmesini destekler. Proje kurulum gereksinimleri hakkında daha fazla bilgi edinmek için bkz . Zaman uyumsuz programlama.
Zaman uyumsuz API'leri kullanarak blob indirmek için şu adımları izleyin:
Aşağıdaki içeri aktarma deyimlerini ekleyin:
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, BlobClient
kullanarak
asyncio.run
programı çalıştırmak için kod ekleyin. Bu işlev,main()
örneğimizde geçirilen eş yordamları çalıştırır ve olay döngüsünü yönetirasyncio
. Eş yordamlar zaman uyumsuz/await söz dizimi ile bildirilir. Bu örnekte,main()
coroutine önce kullanarakasync with
en üst düzeyiBlobServiceClient
oluşturur, ardından blobu indiren yöntemi çağırır. Yalnızca en üst düzey istemcinin kullanmasıasync with
gerektiğini unutmayın; bu istemciden oluşturulan diğer istemciler aynı bağlantı havuzunu paylaşır.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.download_blob_to_file(blob_service_client, "sample-container") if __name__ == '__main__': asyncio.run(main())
Blobu indirmek için kod ekleyin. Aşağıdaki örnek, nesne kullanarak
BlobClient
bir blobu yerel dosya yoluna indirir. Kod, zaman uyumlu örnekle aynıdır, ancak yöntemi anahtar sözcüğüyleasync
bildirilir veawait
yöntemi çağrılırkendownload_blob
anahtar sözcüğü kullanılır.async def download_blob_to_file(self, blob_service_client: BlobServiceClient, container_name): blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt") with open(file=os.path.join(r'filepath', 'filename'), mode="wb") as sample_blob: download_stream = await blob_client.download_blob() data = await download_stream.readall() sample_blob.write(data)
Bu temel kurulumla, bu makaledeki diğer örnekleri zaman uyumsuz/await söz dizimini kullanarak eş yordam olarak uygulayabilirsiniz.
Kaynaklar
Python için Azure Blob Depolama istemci kitaplığını kullanarak blobları indirme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.
Kod örnekleri
- Bu makaledeki (GitHub) zaman uyumlu veya zaman uyumsuz kod örneklerini görüntüleyin
REST API işlemleri
Python için Azure SDK, Azure REST API'sinin üzerinde derlenmiş kitaplıklar içerir ve tanıdık Python paradigmalarıyla REST API işlemleriyle etkileşim kurmanızı sağlar. Blobları indirmek için istemci kitaplığı yöntemleri aşağıdaki REST API işlemini kullanır:
- Blob Alma (REST API)
İstemci kitaplığı kaynakları
İlgili içerik
- Bu makale, Python için Blob Depolama geliştirici kılavuzunun bir parçasıdır. Daha fazla bilgi edinmek için Python uygulamanızı oluşturma makalesinde geliştirici kılavuzu makalelerinin tam listesine bakın.