Сохранение списка строк в наборе данных 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'