Сохранение списка строк в наборе данных HDF5 из Python

Я пытаюсь сохранить список строк переменной длины в наборе данных HDF5. Код для этого

import h5py
h5File=h5py.File('xxx.h5','w')
strList=['asas','asas','asas']  
h5File.create_dataset('xxx',(len(strList),1),'S10',strList)
h5File.flush() 
h5File.Close()  

Я получаю сообщение об ошибке "TypeError: Нет пути преобразования для dtype: dtype ('& lt U3')" где < lt означает фактическое значение меньше, чем символ Как я могу решить эту проблему.

Ответы

Ответ 1

Вы читаете строки Unicode, но указываете свой тип данных как ASCII. Согласно h5py wiki, h5py в настоящее время не поддерживает это преобразование.

Вам нужно закодировать строки в формате h5py:

asciiList = [n.encode("ascii", "ignore") for n in strList]
h5File.create_dataset('xxx', (len(asciiList),1),'S10', asciiList)

Примечание. Не все кодированные в UTF-8 могут быть закодированы в ASCII!

Ответ 2

В подобной ситуации я хочу сохранить имена столбцов dataframe в качестве набора данных в файле hdf5. Предполагая, что df.columns я хочу сохранить, я нашел следующие работы:

h5File = h5py.File('my_file.h5','w')
h5File['col_names'] = df.columns.values.astype('S')

Это предполагает, что имена столбцов являются "простыми" строками, которые могут быть закодированы в ASCII.

Ответ 3

В HDF5 данные в формате VL хранятся как векторы произвольной длины базовый тип. В частности, строки хранятся в C-стиле в буферы с нулевым завершением. NumPy не имеет встроенного механизма поддержки это. К сожалению, это де-факто стандарт для представления строк в API HDF5 C и во многих приложениях HDF5.

К счастью, NumPy имеет общий тип указателя в форме Тип объекта "объект" ( "O" ). В h5py строки переменной длины отображаются на массивы объектов. Небольшое количество метаданных, прикрепленных к типу "O" сообщает h5py, что его содержимое должно быть преобразовано в строки VL, когда хранятся в файле.

Существующие строки VL могут быть прочитаны и записаны без дополнительных усилия; Строки Python и строки NumPy фиксированной длины могут быть автоматически преобразуется в данные VL и сохраняется.

Пример

In [27]: dt = h5py.special_dtype(vlen=str)

In [28]: dset = h5File.create_dataset('vlen_str', (100,), dtype=dt)

In [29]: dset[0] = 'the change of water into water vapour'

In [30]: dset[0]
Out[30]: 'the change of water into water vapour'