#python #azure-blob-storage #hdf5
#питон #azure-хранилище больших двоичных объектов #hdf5
Вопрос:
Я пытаюсь загрузить файл большого двоичного объекта и сохранить его локально на своем компьютере. Формат файла-HDF5 (формат, в котором я пока ограничен/не сталкивался).
До сих пор мне удавалось загружать что-то с помощью приведенных ниже сценариев. Ключевая проблема в том, что, похоже, это не полный файл. При загрузке файла непосредственно из проводника хранилища он составляет около 4000 кб. Файл HDF5, который я сохраняю, составляет 2 кб.
Что я делаю не так? Мне где-то не хватает readall ()?
Я впервые работаю с хранилищем больших двоичных объектов и 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 (amp; save) hf.close()
Комментарии:
1. Привет @Стивен. уэбб ,если приведенный ниже ответ полезен для вас, вы можете принять его как ответ( нажмите на галочку рядом с ответом, чтобы переключить его с серого на заполненный.). Это может быть полезно для других членов сообщества. Спасибо
Ответ №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)
выход