.h5文件初识


h5文件中有两个核心的概念:组“group”和数据集“dataset”。 一个h5文件就是 “dataset” 和 “group” 二合一的容器。
?? dataset :简单来讲类似数组组织形式的数据集合,像 numpy 数组一样工作,一个dataset即一个numpy.ndarray(np.array只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类)。具体的dataset可以是图像、表格,甚至是pdf文件和excel。
?? group:包含了其它 dataset(数组) 和 其它 group ,像字典一样工作。
?? 一个h5文件被像linux文件系统一样被组织起来:dataset是文件,group是文件夹,它下面可以包含多个文件夹(group)和多个文件(dataset)。形象来看h5数据组织方式大概像酱婶儿的,诺!跟文件系统一样,大概知道它为啥叫层次数据格式了吧!
?? 在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Reading h5 file

import h5py
with h5py.File('cat_dog.h5',"r") as f:
    for key in f.keys():
         #print(f[key], key, f[key].name, f[key].value) # 因为这里有group对象它是没有value属性的,故会异常。另外字符串读出来是字节流,需要解码成字符串。
        print(f[key], key, f[key].name) # f[key] means a dataset or a group object. f[key].value visits dataset' value,except group object.
"""
结果:
<HDF5 group "/dogs" (1 members)> dogs /dogs
<HDF5 dataset "list_classes": shape (2,), type "|S7"> list_classes /list_classes
<HDF5 dataset "train_set_x": shape (209, 64, 64, 3), type "|u1"> train_set_x /train_set_x
<HDF5 dataset "train_set_y": shape (209,), type "<i8"> train_set_y /train_set_y

代码解析:
文件对象f它表示h5文件的根目录(root group),前面说了group是按字典的方式工作的,通过f.keys()来找到根目录下的所有dataset和group的key,然后通过key
来访问各个dataset或group对象。

结果解析:
1.我们可以发现这个h5文件下有1个叫dogs的文件夹(group)和3个文件(dataset)它们分别叫list_classes,train_set_x,train_set_y它们的shape都可知。
dogs group下有一个成员但我们不知道它是group还是dataset。
2.我们可以发现key和name的区别:  
上层group对象是通过key来访问下层dataset或group的而不是通过name来访问的;    
因为name属性它是dataset或group的绝对路径并非是真正的"name",key才是真正的"name"。    
name绝对路径:比如下文中访问name得到:/dogs/husky,它表示根目录下有dogs这个挂载点,dogs下又挂载了husky。
"""  
    dogs_group =  f["dogs"]
    for key in dogs_group.keys():
        print(dogs_group[key], dogs_group[key].name)
"""
结果:
<HDF5 dataset "husky": shape (64, 64, 3), type "<f8"> /dogs/husky
可见dogs文件夹下有个key为husky的文件dataset
"""