使用Python从Azure容器下载所有blob文件到本地

9

我正在使用 Visual Studio 中的 Python 3.6,并且希望从 Azure 容器中下载所有 Blob 文件到一个文件夹。以下是我的代码,但问题在于,它只能下载一个 Blob 文件并将其覆盖到第一个文件,最终我只有最后一个 Blob 文件在本地文件夹中。我该如何一次性下载所有 Blob 文件到一个文件夹中?

from azure.storage.blob import BlockBlobService
block_blob_service = BlockBlobService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)

generator = block_blob_service.list_blobs(CONTAINER_NAME)
        for blob in generator:
            block_blob_service.get_blob_to_path(CONTAINER_NAME, blob.name, LOCAL_FILE)

你的意思是要下载它们并将这些 blob 追加到一个单独的文件中吗? - Hai Vu
您需要自己将它们组合。或者将它们下载到单个流中。但是get_blob_to_path()方法不会将内容附加到文件中。 - David Makogon
你尝试过将 open_mode='ab' 传递给 get_blob_to_path 吗? - Hai Vu
2个回答

16

根据我的理解,我认为有两种解决方案可以满足您的需求。

  1. 通过方法 get_blob_to_bytesget_blob_to_stream 从容器下载所有 blob,并将这些 blob 内容写入单个文件中,请参见下面的示例代码。

    from azure.storage.blob import BlockBlobService
    
    block_blob_service = BlockBlobService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)
    
    generator = block_blob_service.list_blobs(CONTAINER_NAME)
    
    fp = open('<your-local-file-name>', 'ab')
    
    for blob in generator:
        # Using `get_blob_to_bytes`
        b = service.get_blob_to_bytes(container_name, blob.name)
        fp.write(b.content)
        # Or using `get_blob_to_stream`
        # service.get_blob_to_stream(container_name, blob.name, fp)
    
    fp.flush()
    fp.close()
    
  2. 通过方法get_blob_to_bytes从容器中下载所有的blob,并将这些blob写入zip文件中,请参见下面的示例代码。

  3. from azure.storage.blob import BlockBlobService
    import zipfile
    
    block_blob_service = BlockBlobService(account_name=ACCOUNT_NAME, account_key=ACCOUNT_KEY)
    
    generator = block_blob_service.list_blobs(CONTAINER_NAME)
    
    zf = zipfile.ZipFile(CONTAINER_NAME+'.zip', 
                 mode='w',
                 compression=zipfile.ZIP_DEFLATED, 
                 )
    
    for blob in generator:
        b = service.get_blob_to_bytes(container_name, blob.name)
        zf.writestr(blob.name, b.content)
    
    zf.close()
    
    希望它有所帮助。如果有任何疑虑,请随时告诉我。

完美的答案..!! 这就是我在寻找的。我认为问题应该被编辑,以便谷歌可以索引它。 - Priyansh

1
azure-storage-blob 版本 12.9.0 中,我使用了下面的脚本:
        from azure.storage.blob import BlobServiceClient
        import zipfile
        conn_str = ''
        block_blob_service = BlobServiceClient.from_connection_string(conn_str)
        generator = block_blob_service.get_container_client(container_name)
        my_blobs = generator.list_blobs()

        zf = zipfile.ZipFile("data"+'.zip', mode='w', compression=zipfile.ZIP_DEFLATED)

        for blob in my_blobs:
                bytes = generator.get_blob_client(blob.name).download_blob().readall()
                zf.writestr(blob.name, bytes)

        zf.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接