如何使用 h5py 读取可变长度字符串

How to read variable-length strings with h5py

我正在尝试使用 h5py 从用 C 语言创建的 HDF5 文件中读取可变长度字符串数组。作为一个简单的示例,我使用了来自 HDF5 组的可变长度字符串数组示例,h5ex_t_vlstringatt.c 在 https://support.hdfgroup.org/HDF5/examples/api-c.html。我用 h5pcc 编译,示例程序运行良好(它读取它写入的文件并打印出内容)。

然而,我在python中得到了一个空对象;用一个简单的示例程序

import h5py                                                                      
fnam = 'h5ex_t_vlstringatt.h5'                                                   
data = h5py.File(fnam, 'r')                                                      
print data['DS1']

我明白了

<HDF5 dataset "DS1": shape None, type "<i4">

此外,我正在使用我刚刚更新的 python 的 anaconda 发行版,所以 h5py 的版本是 ~2.8。

正在从 link 下载文件:

2148:~/mypy$ h5dump h5ex_t_vlstringatt.h5 
HDF5 "h5ex_t_vlstringatt.h5" {
GROUP "/" {
   DATASET "DS1" {
      DATATYPE  H5T_STD_I32LE
      DATASPACE  NULL
      DATA {
      }
      ATTRIBUTE "A1" {
         DATATYPE  H5T_STRING {
            STRSIZE H5T_VARIABLE;
            STRPAD H5T_STR_SPACEPAD;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         }
         DATASPACE  SIMPLE { ( 4 ) / ( 4 ) }
         DATA {
         (0): "Parting", "is such", "sweet", "sorrow."
         }
      }
   }
}
}

在 Ipython 会话中

In [167]: f = h5py.File('h5ex_t_vlstringatt.h5', 'r')
In [168]: list(f.keys())
Out[168]: ['DS1']
In [169]: f['DS1']
Out[169]: <HDF5 dataset "DS1": shape (), type "<i4">
In [170]: f['DS1'].attrs
Out[170]: <Attributes of HDF5 object at 2826604252>
In [171]: list(f['DS1'].attrs.keys())
Out[171]: ['A1']
In [172]: f['DS1'].attrs['A1']
Out[172]: array([b'Parting', b'is such', b'sweet', b'sorrow.'], dtype=object)

字符串存储在数据集的属性中,而不是作为集合的值。