我想用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
表示
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实现这一目标?或者这不可能吗?
答案 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中的问题。