HDF5中的XML文件,h5py

4 投票
2 回答
3358 浏览
提问于 2025-04-17 08:18

我正在使用h5py来保存数据(浮点数),并且是以组的方式保存。除了数据本身,我还需要在hdf5文件中包含一个额外的文件(一个.xml文件,里面包含必要的信息)。我该怎么做呢?我的做法是否有问题?

f = h5py.File('filename.h5')
f.create_dataset('/data/1',numpy_array_1)
f.create_dataset('/data/2',numpy_array_2)
.
.

我的h5结构应该是这样的:

/ 
/data
/data/1 (numpy_array_1)
/data/2 (numpy_array_2)
.
.
/morphology.xml (?)

2 个回答

3

如果你只是想把XML文件附加到hdf5文件上,可以把它作为一个属性添加到hdf5文件里。

xmlfh = open('morphology.xml', 'rb')
h5f.attrs['xml'] = xmlfh.read()

然后你可以这样访问这个XML文件:

h5f.attrs['xml']

需要注意的是,属性的大小不能超过64K,所以在附加之前,你可能需要先压缩一下文件。你可以查看Python标准库中的压缩库。

不过,这样做并不能让XML文件中的信息很方便地使用。如果你想把每个数据集的元数据和XML文件中的某些元数据关联起来,你可以使用像lxml这样的XML库来进行映射。你也可以把XML数据中的每个字段作为一个单独的属性添加,这样就可以通过XML字段来查询数据集,这一切都取决于你XML文件里的内容。想想你以后想怎么获取这些数据。

你可能还想为每个XML文件及其数据集创建一个组,把它们都放在一个hdf5文件里。我不知道你正在处理的文件有多大,具体情况可能会有所不同。

5

一种选择是将其作为可变长度的字符串数据集添加。

http://code.google.com/p/h5py/wiki/HowTo#Variable-length_strings

例如:

import h5py
xmldata = """<xml>
<something>
    <else>Text</else>
</something>
</xml>
"""

# Write the xml file...
f = h5py.File('test.hdf5', 'w')
str_type = h5py.new_vlen(str)
ds = f.create_dataset('something.xml', shape=(1,), dtype=str_type)
ds[:] = xmldata
f.close()

# Read the xml file back...
f = h5py.File('test.hdf5', 'r')
print f['something.xml'][0]

撰写回答