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

Hdf5 如何使用h5py读取可变长度字符串,hdf5,h5py,Hdf5,H5py,我试图使用h5py从用C创建的HDF5文件中读取可变长度字符串数组。举个简单的例子,我使用了HDF5组中的可变长度字符串数组示例h5ex_t_vlstringatt.C at。我用h5pcc编译,示例程序运行良好(它读入它编写的文件并打印出内容) 然而,我在python中只得到一个空对象;用一个简单的示例程序 import h5py fnam = 'h5ex

我试图使用h5py从用C创建的HDF5文件中读取可变长度字符串数组。举个简单的例子,我使用了HDF5组中的可变长度字符串数组示例h5ex_t_vlstringatt.C at。我用h5pcc编译,示例程序运行良好(它读入它编写的文件并打印出内容)

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

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



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

从链接下载该文件:

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)
[167]中的
f=h5py.File('h5ex\u t\u vlstringatt.h5','r')
在[168]中:列表(f.keys())
Out[168]:['DS1']
在[169]中:f['DS1']
出[169]:
在[170]中:f['DS1'].attrs
出[170]:
在[171]中:列表(f['DS1'].attrs.keys())
Out[171]:[A1']
在[172]中:f['DS1'].attrs['A1']
Out[172]:数组([b'deving',b'is some',b'sweet',b'saless.],dtype=object)

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

Ah,正是如此。现在一切都很好。我仍然不知道如何编写可变长度字符串的数据集,但至少在我的应用程序中,将它们作为属性写入更有意义。你试过了吗?我已经回答了一些关于这方面的问题。我确实看过本教程,但我对用C编写变长字符串感兴趣,而不是用python。我应该遵循中的h5ex_t_vlstring.c,但将字符串数组作为属性编写对我来说是有意义的。
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)