Как сохранить и загрузить словарь Python с HDF5 - PullRequest
1 голос
/ 15 апреля 2020

У меня проблемы с загрузкой (я думаю, что сохранение работает - файл создается и содержит данные) словарь (строковый ключ и значение массива / списка) из файла HDF5. Я получаю следующую ошибку:

ValueError: неверно сформированный узел или строка:

Мой код:

import h5py

def store_table(self, filename):
    table = dict()
    table['test'] = list(np.zeros(7,dtype=int))

    with h5py.File(filename, "w") as file:
        file.create_dataset('dataset_1', data=str(table))
        file.close()


def load_table(self, filename):
    file = h5py.File(filename, "r")
    data = file.get('dataset_1')
    print(ast.literal_eval(data))

Я читал в Интернете, используя ast метод literal_eval должен работать, но, похоже, не помогает ... Как сделать Я «распаковываю» HDF5, так что это словарь снова?

Любые идеи будут оценены.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Если я понимаю, что вы пытаетесь сделать, это должно сработать:

import numpy as np
import ast
import h5py


def store_table(filename):
    table = dict()
    table['test'] = list(np.zeros(7,dtype=int))

    with h5py.File(filename, "w") as file:
        file.create_dataset('dataset_1', data=str(table))


def load_table(filename):
    file = h5py.File(filename, "r")
    data = file.get('dataset_1')[...].tolist()
    file.colse();
    return ast.literal_eval(data)

filename = "file.h5"
store_table(filename)
data = load_table(filename)
print(data)

0 голосов
/ 17 апреля 2020

Мне не ясно, чего вы действительно хотите достичь sh. (Я подозреваю, что в ваших словарях более семи нулей. В противном случае HDF5 излишне хранит ваши данные.) Если у вас много очень больших словарей, было бы лучше преобразовать данные в массив NumPy, чем либо 1) создайте и загрузите набор данных с помощью data= или 2) создайте набор данных с соответствующим dtype, затем заполните. Вы можете создавать наборы данных со смешанными типами данных, которые не рассматривались в предыдущем решении. Если эти ситуации не применяются, вы можете сохранить словарь в качестве атрибутов. Атрибуты могут быть связаны с группой, набором данных или самим объектом файла. Что лучше, зависит от ваших требований.

Я написал короткий пример, чтобы показать, как загружать пары ключ / значение словаря в виде пар атрибутов / значений, помеченных для группы. В этом примере я предположил, что в словаре есть ключ имени с именем группы для связи. Процесс практически идентичен для набора данных или файлового объекта (просто измените ссылку на объект).

import h5py

def load_dict_to_attr(h5f, thisdict) :

   if 'name' not in thisdict:
       print('Dictionary missing name key. Skipping function.')
       return

   dname = thisdict.get('name') 
   if dname in h5f:
       print('Group:' + dname + ' exists. Skipping function.')
       return
   else: 
       grp = h5f.create_group(dname)

       for key, val in thisdict.items():
           grp.attrs[key] = val

###########################################

def get_grp_attrs(name, node) :

    grp_dict = {}
    for k in node.attrs.keys():
        grp_dict[k]= node.attrs[k]

    print (grp_dict)

###########################################

car1 = dict( name='my_car', brand='Ford', model='Mustang', year=1964,
             engine='V6',  disp=260,  units='cu.in' )
car2 = dict( name='your_car', brand='Chevy', model='Camaro', year=1969,
             engine='I6',  disp=250,  units='cu.in' )
car3 = dict( name='dads_car', brand='Mercedes', model='350SL', year=1972,
             engine='V8',  disp=4520, units='cc' )
car4 = dict( name='moms_car', brand='Plymouth', model='Voyager', year=1989,
             engine='V6',  disp=289,  units='cu.in' )

a_truck = dict(             brand='Dodge', model='RAM', year=1984,
               engine='V8', disp=359, units='cu.in' )

garage = dict(my_car=car1, 
              your_car=car2,
              dads_car=car3,
              moms_car=car4,
              a_truck=a_truck )

with h5py.File('SO_61226773.h5','w') as h5w:

    for car in garage:
        print ('\nLoading dictionary:', car)
        load_dict_to_attr(h5w, garage.get(car))

with h5py.File('SO_61226773.h5','r') as h5r:

    print ('\nReading dictionaries from Group attributes:')
    h5r.visititems (get_grp_attrs)
...