Megosztás a következőn keresztül:


Blob letöltése a Pythonnal

Ez a cikk bemutatja, hogyan tölthet le egy blobot a Pythonhoz készült Azure Storage-ügyfélkódtár használatával. Blobadatokat különböző célhelyekre tölthet le, például helyi fájl elérési útját, streamét vagy szöveges sztringet. Megnyithat egy blobstreamet is, és olvashat belőle.

A blobok aszinkron API-k használatával történő letöltéséről további információt a blobok aszinkron letöltése című témakörben talál.

Előfeltételek

  • Ez a cikk feltételezi, hogy már van egy projektje, amely a PythonHoz készült Azure Blob Storage ügyfélkódtárral működik együtt. Ha többet szeretne megtudni a projekt beállításáról, beleértve a csomagtelepítést, az utasítások hozzáadását import és egy engedélyezett ügyfélobjektum létrehozását, olvassa el az Azure Blob Storage és a Python használatának első lépéseit.
  • Ha aszinkron API-kat szeretne használni a kódban, tekintse meg az Aszinkron programozási szakasz követelményeit.
  • Az engedélyezési mechanizmusnak rendelkeznie kell a letöltési művelet végrehajtásához szükséges engedélyekkel. További információkért tekintse meg az alábbi REST API-művelet engedélyezési útmutatóját:

Blob letöltése

A blobok letöltéséhez a következő módszert használhatja:

A download_blob metódus egy StorageStreamDownloader objektumot ad vissza. A letöltés során az ügyfélkódtárak a letöltési kérést adattömbökre osztják, ahol az egyes adattömbök egy külön Blob-tartomány lekérése kéréssel lesznek letöltve. Ez a viselkedés a blob teljes méretétől és az adatátviteli beállítások beállításától függ.

Letöltés fájlelérési útvonalra

Az alábbi példa letölt egy blobot egy fájl elérési útjára:

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

Letöltés streambe

Az alábbi példa egy blobot tölt le egy streambe. Ebben a példában StorageStreamDownloader.read_into letölti a blob tartalmát egy streambe, és visszaadja az olvasási bájtok számát:

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}")

Blob letöltése adattömbökben

Az alábbi példa letölt egy blobot, és a letöltési adatfolyamban lévő adattömbökön keresztüli iterálást hajtja végre. Ebben a példában a StorageStreamDownloader.chunks egy iterátort ad vissza, amely lehetővé teszi a blobtartalom adattömbökben való olvasását:

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)

Letöltés sztringre

Az alábbi példa szövegként tölti le a blob tartalmát. Ebben a példában a encoding paraméter egy sztring visszaadásához szükséges readall() , ellenkező esetben bájtokat ad vissza:

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}")

Blokkblob letöltése konfigurációs beállításokkal

Blob letöltésekor megadhatja az ügyfélkódtár konfigurációs beállításait. Ezek a beállítások a teljesítmény javítása és a megbízhatóság növelése érdekében hangolhatók. Az alábbi példakód bemutatja, hogyan definiálhat konfigurációs beállításokat a letöltésekhez mind a metódus szintjén, mind az ügyfél szintjén a BlobClient példányosítása során. Ezek a beállítások containerClient-példányokhoz vagy BlobServiceClient-példányokhoz is konfigurálhatók.

Adatátviteli beállítások megadása letöltéskor

Az ügyfél példányosításakor konfigurálási beállításokat állíthat be az adatátviteli műveletek teljesítményének optimalizálása érdekében. Ügyfélobjektum Pythonban történő létrehozásakor a következő kulcsszóargumentumokat adhatja át:

  • max_chunk_get_size - A blob letöltéséhez használt maximális adattömbméret. Alapértelmezés szerint 4 MiB.
  • max_single_get_size – Egy blob maximális mérete, amely egyetlen hívásban tölthető le. Ha a blob teljes mérete meghaladja max_single_get_sizea teljes méretet, a blobadatok fennmaradó része adattömbökben lesz letöltve. Alapértelmezés szerint 32 miB.

Letöltési műveletek esetén az argumentumot is átadhatja download_blob max_concurrency hívásakor. Ez az argumentum határozza meg a letöltési művelet párhuzamos kapcsolatainak maximális számát.

Az alábbi példakód bemutatja, hogyan adhatja meg az adatátviteli beállításokat egy BlobClient objektum létrehozásakor, és hogyan tölthet le adatokat az ügyfélobjektum használatával. Az ebben a mintában megadott értékek nem javaslatok. Ezeknek az értékeknek a megfelelő finomhangolásához figyelembe kell vennie az alkalmazás adott igényeit.

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

Blobok aszinkron letöltése

A Pythonhoz készült Azure Blob Storage ügyfélkódtár támogatja a blobok aszinkron letöltését. A projektbeállítási követelményekről további információt az Aszinkron programozás című témakörben talál.

A blob aszinkron API-k használatával való letöltéséhez kövesse az alábbi lépéseket:

  1. Adja hozzá a következő importálási utasításokat:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobClient
    
  2. Kód hozzáadása a program futtatásához a következő használatával asyncio.run: . Ez a függvény a példánkban futtatja az átadott koroutint, main() és kezeli az asyncio eseményhurokot. A koroutinok az aszinkron/várakozási szintaxissal vannak deklarálva. Ebben a példában a main() coroutine először a legfelső szintet BlobServiceClientasync withhozza létre, majd meghívja a blobot letöltő metódust. Vegye figyelembe, hogy csak a legfelső szintű ügyfélnek kell használnia async with, mivel az abból létrehozott többi ügyfél ugyanazt a kapcsolatkészletet használja.

    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())
    
  3. Adjon hozzá kódot a blob letöltéséhez. Az alábbi példa egy blobot tölt le egy helyi fájl elérési útjára egy BlobClient objektum használatával. A kód megegyezik a szinkron példával, azzal a kivétellel, hogy a metódus a kulcsszóval async van deklarálva, és a await kulcsszót a metódus meghívásakor használja a download_blob rendszer.

    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)
    

Ezzel az alapszintű beállítással a cikkben más példákat is implementálhat coroutinesként az aszinkron/várakozási szintaxis használatával.

Források

Ha többet szeretne megtudni arról, hogyan tölthet le blobokat a Pythonhoz készült Azure Blob Storage ügyfélkódtár használatával, tekintse meg az alábbi erőforrásokat.

REST API-műveletek

Az Azure SDK for Python olyan kódtárakat tartalmaz, amelyek az Azure REST API-ra épülnek, lehetővé téve a REST API-műveletek használatát jól ismert Python-paradigmákon keresztül. A blobok letöltéséhez használt ügyfélkódtár-metódusok a következő REST API-műveletet használják:

Kódminták

Ügyfélkódtár erőforrásai