我试图将一个可变长度的字符串列表存储到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()
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,指出"TypeError:没有dtype的转换路径:dtype('< U3')"其中<表示实际小于符号
我该如何解决这个问题.
Sli*_*ban 25
您正在读取Unicode字符串,但将数据类型指定为ASCII.根据h5py wiki,h5py目前不支持此转换.
您需要以h5py句柄格式对字符串进行编码:
asciiList = [n.encode("ascii", "ignore") for n in strList]
h5File.create_dataset('xxx', (len(asciiList),1),'S10', asciiList)
Run Code Online (Sandbox Code Playgroud)
注意:并非以UTF-8编码的所有内容都可以用ASCII编码!
在HDF5中,VL格式的数据存储为基本类型的任意长度向量。特别是,字符串以C样式存储在以null结尾的缓冲区中。NumPy没有本机机制来支持此功能。不幸的是,这是在HDF5 C API和许多HDF5应用程序中表示字符串的事实上的标准。
值得庆幸的是,NumPy具有“ object”(“ O”)dtype形式的通用指针类型。在h5py中,可变长度字符串被映射到对象数组。附加到“ O” dtype的少量元数据告诉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'
Run Code Online (Sandbox Code Playgroud)
小智 5
我处于类似的情况,希望将数据框的列名作为数据集存储在 hdf5 文件中。假设 df.columns 是我想要存储的,我发现以下作品:
h5File = h5py.File('my_file.h5','w')
h5File['col_names'] = df.columns.values.astype('S')
Run Code Online (Sandbox Code Playgroud)
这假设列名称是可以用 ASCII 编码的“简单”字符串。