【发布时间】:2017-10-18 09:23:02
【问题描述】:
我正在尝试将常规 python 对象(包括几个键/值对)写入 hdf5 文件。我将 h5py 2.7.0 与 python 3.5.2.3 一起使用。
现在,我正在尝试将一个对象完整地写入数据集:
#...read dataset, store one data object in 'obj'
#obj could be something like: {'value1': 0.09, 'state': {'angle_rad': 0.034903, 'value2': 0.83322}, 'value3': 0.3}
dataset = h5File.create_dataset('grp2/ds3', data=obj)
这会产生错误,因为基础dtype 无法转换为native HDF5 equivalent:
File "\python-3.5.2.amd64\lib\site-packages\h5py\_hl\group.py", line 106, in 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", line 100, in make_new_dset
tid = h5t.py_create(dtype, logical=1)
File "h5py\h5t.pyx", line 1543, in h5py.h5t.py_create (D:\Build\h5py\h5py-hdf5
110-git\h5py\h5t.c:18116)
File "h5py\h5t.pyx", line 1565, in h5py.h5t.py_create (D:\Build\h5py\h5py-hdf5
110-git\h5py\h5t.c:17936)
File "h5py\h5t.pyx", line 1620, in h5py.h5t.py_create (D:\Build\h5py\h5py-hdf5
110-git\h5py\h5t.c:17837)
TypeError: Object dtype dtype('O') has no native HDF5 equivalent
是否可以以“动态”方式将对象写入 HDF5 文件?
【问题讨论】:
-
不,您不能将通用 Python 对象写入
hdf5文件(字典、列表、类等)。该文件格式旨在保存数字数据,大致相当于numpy数组,以及字符串等少量其他内容。 -
@hpaulj 我的对象包含 int、double、float 类型的字段以及一些字符串。我要问的是,是否有一种“自动”的方法可以从我拥有的对象结构中创建 hdf5 复合类型。这样我就可以在循环中重用该复合类型并将我的对象传递给它。我知道我可以通过使用复合类型在 HDF5 中拥有类似对象的结构。但是如何使用 h5py 创建它们?
-
所以你问的是保存结构化数组?复合数据类型还是对象数据类型?
-
@hpaulj 复合数据类型。我对 h5py 和 python 不是很熟悉,因为我之前使用过 HDF5s C++ API。请参阅support.hdfgroup.org/HDF5/Tutor/compound.html 和此处groups.google.com/forum/#!searchin/h5py/compound|sort:relevance/… - 第二个链接显示了如何在 h5py 中完成此操作。
if useCompoundType之后的代码是我几分钟前偶然发现的。这看起来很有希望。我正在寻找一种以动态方式进行他的datatype=[('timeStamp', 'float32'), ('value','float32')]初始化的方法。有什么想法吗? -
我自己没有尝试过,但也许 hickle 对你的情况有用。 github.com/telegraphic/hickle