h5py - 动态将对象写入文件?
h5py - 动态将对象写入文件?
我正在尝试将常规的Python对象(包含多个键/值对)写入HDF5文件。我正在使用h5py 2.7.0和Python 3.5.2.3。\n目前,我正在尝试将一个完整的对象写入数据集:\n
#...读取数据集,将一个数据对象存储在'obj'中 #obj可能是这样的:{'value1': 0.09, 'state': {'angle_rad': 0.034903, 'value2': 0.83322}, 'value3': 0.3} dataset = h5File.create_dataset('grp2/ds3', data=obj)
\n这会产生一个错误,因为底层的dtype
无法转换为native HDF5 equivalent
:\n
File "\python-3.5.2.amd64\lib\site-packages\h5py\_hl\group.py",第106行,create_dataset dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds) File "\python-3.5.2.amd64\lib\site-packages\h5py\_hl\dataset.py",第100行,make_new_dset tid = h5t.py_create(dtype, logical=1) File "h5py\h5t.pyx",第1543行,h5py.h5t.py_create(D:\Build\h5py\h5py-hdf5 110-git\h5py\h5t.c:18116) File "h5py\h5t.pyx",第1565行,h5py.h5t.py_create(D:\Build\h5py\h5py-hdf5 110-git\h5py\h5t.c:17936) File "h5py\h5t.pyx",第1620行,h5py.h5t.py_create(D:\Build\h5py\h5py-hdf5 110-git\h5py\h5t.c:17837) TypeError:对象dtype dtype('O')没有本机HDF5等效项
\n是否可以以\"动态\"的方式将对象写入HDF5文件?
问题的原因是作者想要动态地将一个类的对象写入.hdf5文件中,然后在另一个脚本中加载该文件。
解决方法是使用h5py库。首先,作者定义了一个名为testclass的类,该类具有两个属性name和color。然后,作者创建了一个testobj对象,将其属性设置为'Chair'和'Red'。接下来,作者使用h5py库创建一个名为test.hdf5的文件,并使用循环将testobj对象的属性写入文件中。
在加载文件的脚本中,作者再次定义了一个testclass类,然后创建了一个空的testobj对象。接着,作者使用h5py库打开test.hdf5文件,并使用循环来读取文件中的属性,并将其设置为testobj对象的属性。
这个方法非常有效,唯一的限制是类的属性必须与h5py库兼容。
问题的原因是用户想要将一个嵌套字典保存到H5文件中,但是不知道如何实现。解决方法是使用h5py库提供的函数和数据结构来动态地将对象写入文件。
用户提供了一个简单的递归函数write_layer,该函数接受一个H5文件组(gp)和一个字典(adict)作为参数。函数首先遍历字典的键值对,如果值是一个字典,则创建一个新的组(gp1)并递归调用write_layer函数。如果值不是一个字典,则创建一个数据集并将其与键值对中的值关联。
用户通过调用write_layer函数并传递一个嵌套字典dd来实现数据的写入。通过查看文件的键列表,可以验证数据是否成功写入。可以通过访问数据集的值来获取特定数据。
然后,用户提供了一个改进的write_layer1函数,该函数将标量保存为属性而不是完整的数据集。该函数与write_layer函数类似,但是在创建数据集时添加了一些条件判断。如果值是一个numpy数组或列表,则创建一个数据集。否则,将值保存为属性。通过查看文件的键列表和属性列表,可以验证数据是否成功保存。
最后,用户提供了另一种方法,使用结构化数组来保存数据。首先,用户定义了一个与字典结构匹配的数据类型(dt)。然后,创建一个空的结构化数组(arr),并使用字典中的数据填充其中一个记录。最后,将结构化数组写入H5文件。
用户还提出了一个关于如何写入数据的问题。他们已经根据之前的解答和原始问题中的注释递归地构建了数据类型。然而,他们不确定如何将数据写入H5文件。他们猜测需要将数据转换为与数据类型声明的顺序相匹配的顺序。他们还提供了一个更详细的示例和遇到的问题。
最后,用户被告知应该提出一个新的问题,因为在评论中很难显示代码。他们被提醒在Python3中,adict.items()返回的是一个dict_items对象,不能直接从中创建数组。建议使用list(adict.items())来获取键值对的列表。