Файл 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.

Другие вопросы по тегам