如何访问h5文件中的数据?sources.h5文件访问问题求助
解决HDF5文件
sources.h5的数据访问问题 1. 报错原因说明
你执行source_cat['sources'][:10]报错,是因为sources是标量数据集(输出显示shape ()),不是多维数组,所以不能用切片语法访问。这个标量里存储的是一组HDF5对象引用和两个数值,需要先取出引用再获取实际数据。
2. 访问sources中的实际数据
先取出标量里的所有元素,区分对象引用和数值,再通过引用从文件中提取对应数据:
import h5py with h5py.File('sources.h5', 'r') as source_cat: # 取出标量数据 sources_content = source_cat['sources'][()] # 遍历元素处理 for idx, item in enumerate(sources_content): if isinstance(item, h5py.h5r.Reference): # 通过引用获取对应数据集 ref_dataset = source_cat[item] print(f"第{idx}个引用对应的数据:") print(f"形状: {ref_dataset.shape}, 类型: {ref_dataset.dtype}") print(f"前10条内容: {ref_dataset[:10]}") print("---") else: print(f"第{idx}个数值: {item}")
3. 查看_types数据集内容
_types一般是定义复合类型的元数据,直接读取即可:
import h5py with h5py.File('sources.h5', 'r') as source_cat: types_data = source_cat['_types'][()] print("_types数据集内容:") print(types_data)
4. 完整的HDF5文件内容遍历脚本
下面的代码可以递归遍历整个文件的结构,打印所有组、数据集的形状、类型及部分内容:
import h5py def traverse_hdf5(name, obj): print(f"路径: {name}") print(f"类型: {type(obj).__name__}") if isinstance(obj, h5py.Dataset): print(f"形状: {obj.shape}, 数据类型: {obj.dtype}") # 尝试打印内容(标量直接输出,数组输出前5条) try: if obj.shape == (): print(f"内容: {obj[()]}") else: print(f"前5条内容: {obj[:5]}") except Exception as e: print(f"读取内容失败: {str(e)}") print("-"*50) with h5py.File('sources.h5', 'r') as source_cat: print("HDF5文件完整结构及内容:") print("="*70) source_cat.visititems(traverse_hdf5)
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

