如何在循环中构建分层HDF5数据集并写入转换后的数据?
HDF5分层结构写入解决方案
直接把读取、处理和写入逻辑整合,用require_group安全创建层级组,避免重复创建报错,同时实现你需要的hdf5_output[molid][confid]['mPOL']访问结构,完整代码如下:
import h5py def convert(at_num_data): # 替换为你的实际转换逻辑 transformed = at_num_data * 2 # 示例转换操作 return transformed # 替换为你的输入文件路径 input_path = "your_input_file.hdf5" with h5py.File(input_path, 'r') as fDFT, h5py.File('restricted.hdf5', 'w') as hdf5_output: mol_ids = list(fDFT.keys()) for molid in mol_ids: # 创建molid对应的顶层组,若已存在则直接返回(比create_group更安全) mol_group = hdf5_output.require_group(molid) conf_ids = list(fDFT[molid].keys()) for confid in conf_ids: if 'opt' in str(confid): # 创建当前confid对应的子组 conf_group = mol_group.require_group(confid) # 读取并写入mPOL数据 res1 = fDFT[molid][confid]['mPOL'][:] conf_group.create_dataset('mPOL', data=res1) # 读取、转换并写入atNUM数据(可自定义数据集名称) at_num_data = fDFT[molid][confid]['atNUM'][:] res2 = convert(at_num_data) conf_group.create_dataset('atNUM_transformed', data=res2)
关键说明:
require_group的优势:如果目标组已存在,create_group会抛出异常,require_group则直接返回已存在的组,适配循环创建场景。- 层级结构对应:
- 顶层组:直接使用
molid的实际值作为组名 - 子组:仅保留包含
opt的confid作为子组名 - 子组内数据集:
mPOL保留原数据,转换后的atNUM可自定义命名存储
- 顶层组:直接使用
- 嵌套
with语句:同时管理输入和输出文件,自动处理文件关闭,避免资源泄漏
生成的HDF5文件可直接通过hdf5_output[molid][confid]['mPOL']访问对应数据。
内容的提问来源于stack exchange,提问作者SGgr
相关产品推荐
相关产品推荐

