Aracılığıyla paylaş


Python ile blok blobu yükleme

Bu makalede, Python için Azure Depolama istemci kitaplığını kullanarak bir blobu karşıya yükleme işlemi gösterilmektedir. Bir dosya yolundan, akıştan, ikili nesneden veya metin dizesinden blok bloba veri yükleyebilirsiniz. Blobları dizin etiketleriyle de karşıya yükleyebilirsiniz.

Zaman uyumsuz API'leri kullanarak blob'ları karşıya yükleme hakkında bilgi edinmek için bkz. Blob'ları zaman uyumsuz olarak karşıya yükleme.

Önkoşullar

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 installaşağıdaki paketleri yükleyin:

pip install azure-storage-blob azure-identity

Import ifadeleri ekle

Aşağıdaki import deyimlerini ekleyin:

import io
import os
import uuid
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, ContainerClient, BlobBlock, BlobClient, StandardBlobTier

Yetkilendirme

Yetkilendirme mekanizması, bir blob yüklemek için gerekli izinlere sahip olmalıdır. Microsoft Entra ID ile yetkilendirme için (önerilir), Azure RBAC ön tanımlı rolü Depolama Blob Verileri Katkıda Bulunanı veya üzeri gerekir. Daha fazla bilgi edinmek için Put Blob (REST API) ve Put Block (REST API) yetkilendirme kılavuzuna bakın.

İ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)

Belirli kapsayıcılar veya bloblar için, doğrudan ya da BlobServiceClient nesnesinden istemci nesneleri de 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.

Blok bloba veri yükleme

Akış veya ikili veri kullanarak bir blob yüklemek için aşağıdaki yöntemi kullanın:

Bu yöntem, otomatik öbekleme ile bir veri kaynağından yeni bir blob oluşturur; bu da veri kaynağının daha küçük öbeklere bölünebileceği ve karşıya yüklenebileceği anlamına gelir. Karşıya yüklemeyi gerçekleştirmek için istemci kitaplığı ya Put Blob ya da birkaç Put Block çağrısı ve ardından Put Block List kullanabilir. Bu davranış, nesnenin genel boyutuna ve veri aktarımı seçeneklerinin nasıl ayarlandığına bağlıdır.

Uyarı

Azure Depolama istemci kitaplıkları aynı bloba eş zamanlı yazmaları desteklemez. Uygulamanız aynı bloba birden çok işlem yazma gerektiriyorsa, öngörülebilir bir deneyim sağlamak için eşzamanlılık denetimine yönelik bir strateji uygulamanız gerekir. Eşzamanlılık stratejileri hakkında daha fazla bilgi edinmek için bkz. Blob Depolama'da eşzamanlılığı yönetme.

Yerel dosya yolundan blok blobu yükleme

Aşağıdaki örnek, bir BlobClient nesnesi kullanarak dosyayı bir blok bloba yükler.

def upload_blob_file(self, blob_service_client: BlobServiceClient, container_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)
    with open(file=os.path.join('filepath', 'filename'), mode="rb") as data:
        blob_client = container_client.upload_blob(name="sample-blob.txt", data=data, overwrite=True)

Akıştan blok blobu yükleme

Aşağıdaki örnek, rastgele bayt verileri oluşturur ve bir BytesIO nesnesini, bir BlobClient nesnesi kullanarak bir blok bloba yükler.

def upload_blob_stream(self, blob_service_client: BlobServiceClient, container_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
    input_stream = io.BytesIO(os.urandom(15))
    blob_client.upload_blob(input_stream, blob_type="BlockBlob")

İkili verileri blok bloba yükleme

Aşağıdaki örnek, bir BlobClient nesnesi kullanılarak ikili verileri blok bloba yükler.

def upload_blob_data(self, blob_service_client: BlobServiceClient, container_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
    data = b"Sample data for blob"

    # Upload the blob data - default blob type is BlockBlob
    blob_client.upload_blob(data, blob_type="BlockBlob")

Dizin etiketleriyle blok bloğu yükleme

Aşağıdaki örnek, dizin etiketlerine sahip bir blok blobunu karşıya yükler:

def upload_blob_tags(self, blob_service_client: BlobServiceClient, container_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)
    sample_tags = {"Content": "image", "Date": "2022-01-01"}
    with open(file=os.path.join('filepath', 'filename'), mode="rb") as data:
        blob_client = container_client.upload_blob(name="sample-blob.txt", data=data, tags=sample_tags)

Yapılandırma seçenekleriyle blok blobu yükle

Blobu karşıya yüklerken istemci kitaplığı yapılandırma seçeneklerini tanımlayabilirsiniz. Bu seçenekler performansı geliştirmek, güvenilirliği artırmak ve maliyetleri iyileştirmek için ayarlanabilir. Aşağıdaki kod örneklerinde, blobclient örneği oluştururken hem yöntem düzeyinde hem de istemci düzeyinde karşıya yükleme 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.

Karşıya yükleme için 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 kelime parametrelerini geçirebilirsiniz.

  • max_block_size - Blok blobu parça parça yüklerken en büyük parça boyutu. Varsayılan değer 4 MiB'dir.
  • max_single_put_size - Eğer blob boyutu max_single_put_size değerine eşit veya daha küçükse, blob tek bir Put Blob isteğiyle karşıya yüklenir. Blob boyutu max_single_put_size değerinden büyükse veya bilinmiyorsa, blob Put Block kullanılarak parçalara bölünerek yüklenir ve Put Block List kullanılarak tamamlanır. Varsayılan değer 64 MiB'dir.

Blob Depolama için aktarım boyutu sınırları hakkında daha fazla bilgi için bkz. Blob depolama için ölçek hedefleri.

Karşıya yükleme işlemleri için, max_concurrency çağırırken bağımsız değişkenini de geçirebilirsiniz. Bu bağımsız değişken, blob boyutu 64 MiB'yi aştığında kullanılacak 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 karşıya yüklemeyi 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 upload_blob_transfer_options(self, account_url: str, container_name: str, blob_name: str):
    # Create a BlobClient object with data transfer options for upload
    blob_client = BlobClient(
        account_url=account_url, 
        container_name=container_name, 
        blob_name=blob_name,
        credential=DefaultAzureCredential(),
        max_block_size=1024*1024*4, # 4 MiB
        max_single_put_size=1024*1024*8 # 8 MiB
    )
    
    with open(file=os.path.join(r'file_path', blob_name), mode="rb") as data:
        blob_client = blob_client.upload_blob(data=data, overwrite=True, max_concurrency=2)

Veri aktarımı seçeneklerini ayarlama hakkında daha fazla bilgi edinmek için bkz Python ile yüklemeler ve indirmeler için performans ayarlama.

Yükleme sırasında bir blob'un erişim katmanını ayarlama

Upload işlemi sırasında, anahtar sözcük bağımsız değişkenini geçerek bir blob'un erişim katmanını ayarlayabilirsiniz. Azure Depolama, blob verilerinizi nasıl kullanıldıklarına bağlı olarak en etkili şekilde depolayabilmeniz için farklı erişim katmanları sunar.

Aşağıdaki kod örneğinde blob karşıya yüklenirken erişim katmanının nasıl ayarlanacağı gösterilmektedir:

def upload_blob_access_tier(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)
    
    #Upload blob to the cool tier
    with open(file=os.path.join(r'file_path', blob_name), mode="rb") as data:
        blob_client = blob_client.upload_blob(data=data, overwrite=True, standard_blob_tier=StandardBlobTier.COOL)

Erişim katmanının ayarlanmasına yalnızca blok blobları için izin verilir. Blok blobu için erişim katmanını Hot, , CoolColdveya Archiveolarak ayarlayabilirsiniz. Erişim katmanını olarak ayarlamak için Colden az 12.15.0 istemci kitaplığı sürümünü kullanmanız gerekir.

Erişim katmanları hakkında daha fazla bilgi edinmek için bkz . Erişim katmanlarına genel bakış.

Blokları hazırlama ve işleme yoluyla blok blobu yükleme

Veri bloklarını tek tek manuel olarak aşamalı hale getirerek yüklemeleri bloklara bölme konusunda daha fazla kontrol sahibi olabilirsiniz. Blobu oluşturan tüm bloklar hazırlandığında, bunları Blob Depolama'ya işleyebilirsiniz.

Bir blobun parçası olarak işlenecek yeni bir blok oluşturmak için aşağıdaki yöntemi kullanın:

Blobu oluşturan blok kimliklerinin listesini belirterek blob yazmak için aşağıdaki yöntemi kullanın:

Aşağıdaki örnek bir dosyadaki verileri okur ve blobun parçası olarak işlenecek blokları aşamalar:

def upload_blocks(self, blob_container_client: ContainerClient, local_file_path: str, block_size: int):
    file_name = os.path.basename(local_file_path)
    blob_client = blob_container_client.get_blob_client(file_name)

    with open(file=local_file_path, mode="rb") as file_stream:
        block_id_list = []

        while True:
            buffer = file_stream.read(block_size)
            if not buffer:
                break

            block_id = uuid.uuid4().hex
            block_id_list.append(BlobBlock(block_id=block_id))

            blob_client.stage_block(block_id=block_id, data=buffer, length=len(buffer))

        blob_client.commit_block_list(block_id_list)

Blobları zaman uyumsuz olarak karşıya yükleme

Python için Azure Blob Depolama istemci kitaplığı, blobların zaman uyumsuz olarak karşıya yüklenmesini destekler. Proje kurulum gereksinimleri hakkında daha fazla bilgi edinmek için bkz . Zaman uyumsuz programlama.

Asenkron API'leri kullanarak bir blobu karşıya yüklemek için şu adımları izleyin:

  1. Aşağıdaki import komutlarını ekleyin:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobClient, ContainerClient
    
  2. kullanarak asyncio.runprogramı çalıştırmak için kod ekleyin. Bu işlev, geçmiş korutini, örneğimizde main(), çalıştırır ve olay döngüsünü yönetir, asyncio. Eş yordamlar async/await söz dizimi ile bildirilir. Bu örnekte, main() coroutine önce, BlobServiceClient kullanarak async with üst düzey öğesini oluşturur, ardından blobu yükleyen yöntemi çağırır. Yalnızca en üst düzey istemcinin kullanması async withgerektiğ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.upload_blob_file(blob_service_client, "sample-container")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. Blobu karşıya yüklemek için kod ekleyin. Aşağıdaki örnek, bir ContainerClient nesnesi kullanarak yerel dosya yolundan bir blob yükler. Kod, eşzamanlı örnek ile aynıdır, ancak yöntem async anahtar sözcüğü ile bildirilir ve await yöntemini çağırırken upload_blob anahtar sözcüğü kullanılır.

    async def upload_blob_file(self, blob_service_client: BlobServiceClient, container_name: str):
        container_client = blob_service_client.get_container_client(container=container_name)
        with open(file=os.path.join('filepath', 'filename'), mode="rb") as data:
            blob_client = await container_client.upload_blob(name="sample-blob.txt", data=data, overwrite=True)
    

Bu temel kurulumla, bu makaledeki diğer örnekleri async/await söz dizimini kullanarak eş yordam olarak uygulayabilirsiniz.

Kaynaklar

Python için Azure Blob Depolama istemci kitaplığını kullanarak blobları karşıya yükleme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.

Kod örnekleri

  • Bu makaledeki senkron veya asenkron kod örneklerini (GitHub) 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ı karşıya yüklemek için istemci kitaplığı yöntemleri aşağıdaki REST API işlemlerini kullanır:

İstemci kitaplığı kaynakları

Ayrıca bkz.

  • 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.