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 meghaladjamax_single_get_size
a 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:
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
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 azasyncio
eseményhurokot. A koroutinok az aszinkron/várakozási szintaxissal vannak deklarálva. Ebben a példában amain()
coroutine először a legfelső szintetBlobServiceClient
async with
hozza létre, majd meghívja a blobot letöltő metódust. Vegye figyelembe, hogy csak a legfelső szintű ügyfélnek kell használniaasync 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())
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óvalasync
van deklarálva, és aawait
kulcsszót a metódus meghívásakor használja adownload_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:
- Blob lekérése (REST API)
Kódminták
- Szinkron vagy aszinkron kódminták megtekintése ebből a cikkből (GitHub)
Ügyfélkódtár erőforrásai
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: