使用Python将字符串列表存储到HDF5数据集

30

我想把一个可变长度的字符串列表存储到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: No conversion path for dtype: dtype('&lt U3')",其中&lt代表实际的小于号。如何解决这个问题。


首先,您在 create_dataset 上有一个拼写错误。您能否提供您正在使用的确切代码,特别是 strList 来自哪里? - SlightlyCuban
抱歉打错字了,我正在尝试将一个pandas数据框序列化到一个HDF5文件中,因此我必须创建一个包含所有列名的标题,所以我提取了列名列表并尝试将其写入HDF5数据集。 - gman
除了上面的错别字,代码模拟了完全相似的情况。 - gman
你应该编辑你的问题并修复拼写错误。 - SlightlyCuban
3个回答

35

您正在读取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编码。


在Python3中,重新从hdf5文件中提取这些字符串的正确方法是什么? - DilithiumMatrix
@DilithiumMatrix ASCII 也是有效的 UTF-8,但如果您需要 str 类型,则可以使用 ascii.decode('utf-8')。注意:我的答案将删除非 ASCII 字符。如果您使用 encode('unicode_escape') 保留了它们,则需要使用 decode('unicode_escape') 将其转换回来。 - SlightlyCuban
@DilithiumMatrix。重新提取代码:stringlist=np.array(f['xxx']) vals=[str(el).strip('[]').strip(''') for el in stringlist.astype(str)] - user3018476

21

https://docs.h5py.org/en/stable/special.html

HDF5中,VL 格式的数据以基础类型的任意长度向量存储。特别地,字符串以 C 风格的空字符终止缓冲区的形式存储。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'

3
如果我有一个字符串列表 ['foo','bar'],我该如何将列表值赋给数据集? - Allan Ruin
小修正:“默认情况下,HDF5数据集中的字符串数据被读取为字节:对于可变长度字符串,使用bytes对象,对于固定长度字符串,使用numpy字节数组('S'数据类型)。”(来源:https://docs.h5py.org/en/stable/strings.html#strings)。因此,第30行的输出实际上是`b'the change of water into water vapour'`。 - urig

6

我处于类似的情况,希望将数据框的列名作为数据集存储在hdf5文件中。假设df.columns是我想要存储的内容,我发现以下方法可行:

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

这里假设列名是“简单”的字符串,可以用ASCII编码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接