使用 Python 将 Blob 下载到本地存储

Posted

技术标签:

【中文标题】使用 Python 将 Blob 下载到本地存储【英文标题】:Download Blob To Local Storage using Python 【发布时间】:2022-01-13 15:34:23 【问题描述】:

我正在尝试下载一个 blob 文件并将其本地存储在我的机器上。文件格式为 HDF5(我目前了解有限/没有经验的格式)。

到目前为止,我已经使用下面的脚本成功地下载了 something。关键问题是它似乎不是完整的文件。直接从存储资源管理器下载文件时,大约为 4,000kb。我保存的 HDF5 文件是 2kb。

我做错了什么?我在某处错过了 readall() 吗?

我第一次使用 blob 存储和 HDF5,所以现在有点卡住了。由于 azure.storage.blob 模块已更新,许多旧问题似乎都在使用已弃用的命令。

from azure.storage.blob import BlobServiceClient
from io import StringIO, BytesIO
import h5py

# Initialise client
blob_service_client = BlobServiceClient.from_connection_string("my_conn_str")
# Initialise container
blob_container_client = blob_service_client.get_container_client("container_name")
# Get blob
blob_client = blob_container_client.get_blob_client("file_path")

# Download
download_stream = blob_client.download_blob()

# Create empty stream
stream = BytesIO()
# Read downloaded blob into stream
download_stream.readinto(stream)
# Create new empty hdf5 file
hf = h5py.File('data.hdf5', 'w')
# Write stream into empty HDF5
hf.create_dataset('dataset_1',stream)
# Close Blob (& save)
hf.close()

【问题讨论】:

嗨@stephen.webb,如果下面的答案对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢 【参考方案1】:

我尝试在我的系统中重现与您尝试的代码相同的问题

所以我尝试了另一种解决方案,将 hdf5 文件作为流读取并将其写入另一个 hdf5 文件中

尝试使用此解决方案。获取一些虚拟数据进行测试。

from azure.storage.blob import BlobServiceClient
from io import StringIO, BytesIO
import numpy as np
import h5py

# Initialise client
blob_service_client = BlobServiceClient.from_connection_string("Connection String")
# Initialise container
blob_container_client = blob_service_client.get_container_client("test//Container name")
# Get blob
blob_client = blob_container_client.get_blob_client("test.hdf5 //Blob name")

print("downloaded the blob ")
# Download
download_stream = blob_client.download_blob()
stream = BytesIO()
downloader = blob_client.download_blob()

# download the entire file in memory here
# file can be many giga bytes! Big problem
downloader.readinto(stream)

# works fine to open the stream and read data
f = h5py.File(stream, 'r')


//dummy data
data_matrix = np.random.uniform(-1, 1, size=(10, 3))

with h5py.File(stream, "r") as f:
    # List all groups
    print("Keys: %s" % f.keys())
    a_group_key = list(f.keys())[0]

    # Get the data
    data = list(f[a_group_key])
    data_matrix=data
    print(data)

with h5py.File("file1.hdf5", "w") as data_file:
    data_file.create_dataset("group_name", data=data_matrix)

输出

【讨论】:

以上是关于使用 Python 将 Blob 下载到本地存储的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 Azure 存储 blob 移动到 Ftp 服务器

如何以BLOB格式将图像上传到Firebase存储?

如何将 Azure VM 磁盘直接上传到 Blob 存储?

如何将 Azure Blob 存储容器挂载为在 Python 中以独立模式在本地运行的 Spark 作业的目录?

存储在 Microsoft SQL 中的 Python blob PDF - 转换回 PDF

Azure 从 Blob 存储中抓取数据 w。 Python(无需下载)