【发布时间】:2016-07-19 07:16:26
【问题描述】:
我有一个 C++ 示例,我正在尝试使用 h5py 进行重现,但它没有按预期工作。我正在使用 h5py 获得空填充字符串,我期望空终止的字符串。
这是我的 C++ 驱动程序...
main.cpp
#include <hdf5.h>
int main(void) {
auto file = H5Fcreate("test-c.h5", H5F_ACC_TRUNC,
H5P_DEFAULT, H5P_DEFAULT);
char strings[5][64] = {
"please work 0",
"please work 1",
"please work 2",
"please work 3",
"please work 4"};
auto H5T_C_S1_64 = H5Tcopy (H5T_C_S1);
H5Tset_size(H5T_C_S1_64, 64);
hsize_t dims[1] = {5};
auto dataspace = H5Screate_simple(1, dims, NULL);
auto dataset = H5Dcreate(file, "test dataset", H5T_C_S1_64, dataspace,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
H5Dwrite (dataset, H5T_C_S1_64, H5S_ALL, H5S_ALL, H5P_DEFAULT, strings);
H5Dclose(dataset);
H5Sclose(dataspace);
H5Tclose(H5T_C_S1_64);
H5Fclose(file);
return 0;
}
我使用以下 SCons 脚本构建。
SConstruct
env = Environment()
env.Append(LIBS=['hdf5'],
CPPFLAGS=['-std=c++11'])
env.Program('writeh5', 'main.cpp')
这是我的 python 脚本,我试图用它写出相同的 hdf5 文件。
main.py
import h5py
hdf5 = h5py.File('test-p.h5', 'w')
H5T_C_S1_64 = h5py.h5t.C_S1.copy()
H5T_C_S1_64.set_size(64)
print "Null Terminated String: %s" % (
H5T_C_S1_64.get_strpad() == h5py.h5t.STR_NULLTERM)
dataset = hdf5.create_dataset('test dataset', (5,),
data=['please work %s' % n for n in xrange(5)],
dtype=H5T_C_S1_64)
hdf5.close()
我使用的是 python v2.7.11,我已经用 h5py v2.5.0 和 v2.6.0 进行了尝试,结果相同。
>> python --version
Python 2.7.11
>> python -c "import h5py; print h5py.version.version"
2.5.0
>> tree
.
├── main.cpp
├── main.py
└── SConstruct
0 directories, 3 files
>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o main.o -c -std=c++11 main.cpp
g++ -o writeh5 main.o -lhdf5
scons: done building targets.
>> tree
.
├── main.cpp
├── main.o
├── main.py
├── SConstruct
└── writeh5
0 directories, 5 files
>> ./writeh5
>> tree
.
├── main.cpp
├── main.o
├── main.py
├── SConstruct
├── test-c.h5
└── writeh5
0 directories, 6 files
>> python main.py
Null Terminated String: True
>> tree
.
├── main.cpp
├── main.o
├── main.py
├── SConstruct
├── test-c.h5
├── test-p.h5
└── writeh5
0 directories, 7 files
>> h5dump test-c.h5
HDF5 "test-c.h5" {
GROUP "/" {
DATASET "test dataset" {
DATATYPE H5T_STRING {
STRSIZE 64;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SIMPLE { ( 5 ) / ( 5 ) }
DATA {
(0): "please work 0", "please work 1", "please work 2",
(3): "please work 3", "please work 4"
}
}
}
}
>> h5dump test-p.h5
HDF5 "test-p.h5" {
GROUP "/" {
DATASET "test dataset" {
DATATYPE H5T_STRING {
STRSIZE 64;
STRPAD H5T_STR_NULLPAD;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SIMPLE { ( 5 ) / ( 5 ) }
DATA {
(0): "please work 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
(1): "please work 1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
(2): "please work 2\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
(3): "please work 3\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
(4): "please work 4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
}
}
}
}
正如您从上面的输出中看到的,在使用 h5py 时,我仍然以空填充的固定长度字符串结束,即使我指定我想要空终止的固定长度字符串。
那么如何修改我的 python 脚本以在数据集中以空终止的固定长度字符串结束?如果是h5py的bug,有什么解决办法吗?
提前感谢您的帮助。
【问题讨论】: