Хранение списка строк в наборе данных 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 означает фактическое меньше, чем символ
Как я могу решить эту проблему.

3 ответов


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

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

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

Примечание: не все, закодированное в UTF-8, может быть закодировано в ASCII!


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

к счастью, NumPy имеет общий тип указателя в виде "object "("O") dtype. В h5py строки переменной длины соответствовать массив объектов. Небольшое количество метаданных, присоединенных к dtype" 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'

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

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

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