如何使用h5py

时间:2017-04-19 11:07:54

标签: h5py

我想用python和h5py编写一个可变长度的字符串。如果我使用

dset = grp.create_dataset('data_set_name',{1},dtype=h5py.special_dtype(vlen=str))
dset[0] = 'some_string'

然后h5dump告诉我

   DATASET "data_set_name" {
      DATATYPE  H5T_STRING {
         STRSIZE H5T_VARIABLE;
         STRPAD H5T_STR_NULLTERM;
         CSET H5T_CSET_UTF8;
         CTYPE H5T_C_S1;
      }
      DATASPACE  SIMPLE { ( 1 ) / ( 1 ) }
      DATA {
      (0): "some_string"
      }
   }

已使用utf-8字符编码。但是,当h5dump表示

时,我想要正常的ascii编码
   DATASET "data_set_name" {
      DATATYPE  H5T_STRING {
         STRSIZE H5T_VARIABLE;
         STRPAD H5T_STR_NULLTERM;
         CSET H5T_CSET_ASCII;
         CTYPE H5T_C_S1;
      }
      DATASPACE  SIMPLE { ( 1 ) / ( 1 ) }
      DATA {
      (0): "some_string"
      }
   }

如何使用h5py实现这一目标?或者这不可能吗?

1 个答案:

答案 0 :(得分:1)

在一个py3会话中,unicode是默认的字符串类型,我必须将ASCII保存为bytestrings。从http://docs.h5py.org/en/latest/strings.html

中提取想法
this

因此两个Python字符串类型都保存为unicode。

In [1]: import h5py
In [2]: f=h5py.File('test.h5','w')
In [3]: grp=f.create_group('test')

In [5]: dset=grp.create_dataset('string',(3,), dtype=h5py.special_dtype(vlen=str))
In [6]: dset
Out[6]: <HDF5 dataset "string": shape (3,), type "|O">
In [7]: dset[0]='astring'
In [8]: dset[1]=b'astring'
In [9]: dset
Out[9]: <HDF5 dataset "string": shape (3,), type "|O">
In [10]: dset[:]
Out[10]: array(['astring', 'astring', ''], dtype=object)

对于属性,保留字符串类型。

In [11]: dset.attrs['string']='unicode string'
In [12]: dset.attrs['bytes']=b'byte string'
In [13]: dset
Out[13]: <HDF5 dataset "string": shape (3,), type "|O">
In [14]: dset.attrs
Out[14]: <Attributes of HDF5 object at 2880654668>
In [15]: list(dset.attrs.items())
Out[15]: [('string', 'unicode string'), ('bytes', b'byte string')]

这两次写了bytestrings。

In [16]: dset2=grp.create_dataset('bstring', (3,), dtype=h5py.special_dtype(vlen=bytes))
In [17]: dset2[0]='astring'
In [19]: dset2[1]=b'astring'
In [22]: dset2[:]
Out[22]: array([b'astring', b'astring', b''], dtype=object)

转储

In [25]: f.close()

因此指定In [26]: !h5dump test.h5 HDF5 "test.h5" { GROUP "/" { GROUP "test" { DATASET "bstring" { DATATYPE H5T_STRING { STRSIZE H5T_VARIABLE; STRPAD H5T_STR_NULLTERM; CSET H5T_CSET_ASCII; CTYPE H5T_C_S1; } DATASPACE SIMPLE { ( 3 ) / ( 3 ) } DATA { (0): "astring", "astring", NULL } } DATASET "string" { DATATYPE H5T_STRING { STRSIZE H5T_VARIABLE; STRPAD H5T_STR_NULLTERM; CSET H5T_CSET_UTF8; CTYPE H5T_C_S1; } DATASPACE SIMPLE { ( 3 ) / ( 3 ) } DATA { (0): "astring", "astring", NULL } ATTRIBUTE "bytes" { DATATYPE H5T_STRING { STRSIZE H5T_VARIABLE; STRPAD H5T_STR_NULLTERM; CSET H5T_CSET_ASCII; CTYPE H5T_C_S1; } DATASPACE SCALAR DATA { (0): "byte string" } } ATTRIBUTE "string" { DATATYPE H5T_STRING { STRSIZE H5T_VARIABLE; STRPAD H5T_STR_NULLTERM; CSET H5T_CSET_UTF8; CTYPE H5T_C_S1; } DATASPACE SCALAR DATA { (0): "unicode string" } } } } } } 而不是bytes可以解决Py3中的问题。