Файл XML внутри HDF5, h5py
Я использую h5py для сохранения данных (числа с плавающей запятой), в группах. В дополнение к самим данным мне нужно включить дополнительный файл (файл.xml, содержащий необходимую информацию) в hdf5. Как мне это сделать? Мой подход неверен?
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 ответа
Один из вариантов - добавить его в виде набора строк переменной длины.
http://code.google.com/p/h5py/wiki/HowTo
Например:
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]
Если вам просто нужно прикрепить файл XML к файлу hdf5, вы можете добавить его в качестве атрибута к файлу hdf5.
xmlfh = open('morphology.xml', 'rb')
h5f.attrs['xml'] = xmlfh.read()
Вы можете получить доступ к XML-файлу, тогда вот так:
h5f.attrs['xml']
Также обратите внимание, что вы не можете хранить атрибуты размером более 64 КБ, вы можете сжать файл перед прикреплением. Вы можете взглянуть на сжатие библиотек в стандартной библиотеке Python.
Однако это не делает информацию в файле XML очень доступной. Если вы хотите связать метаданные каждого набора данных с некоторыми метаданными в файле XML, вы можете сопоставить их по мере необходимости, используя библиотеку XML, такую как lxml. Вы также можете добавить каждое поле данных XML в качестве отдельного атрибута, чтобы можно было запрашивать наборы данных по полю XML, все это зависит от того, что у вас есть в файле XML. Попробуйте подумать, как бы вы хотели получить данные позже.
Вы также можете создать группы для каждого xml-файла с его наборами данных и поместить все это в один hdf5-файл. Я не знаю, насколько велики файлы, которыми вы управляете, YMMV.