.h5文件的写入和读取(HDF5)

  1. 先理解.h5文件的数据组织方式: h5文件中有两个核心的概念:组“group”和数据集“dataset”。 一个h5文件就是 “dataset” 和 “group” 二合一的容器。
  • dataset :简单来讲类似数组组织形式的数据集合,像 numpy 数组一样工作,一个dataset即一个numpy.ndarray。具体的dataset可以是图像、表格,甚至是pdf文件和excel
  • group:包含了其它dataset(数组)和其它 group ,像字典一样工作。
  • 一个h5文件被像linux文件系统一样被组织起来:dataset是文件,group是文件夹,它下面可以包含多个文件夹(group)和多个文件(dataset)。
    .h5文件的写入和读取(HDF5)_第1张图片
  1. h5接受的数据是矩阵跟mat方法一致,但是具有更强的压缩性能
    使用hdf5依赖于python的工具包:h5py
import h5py  #导入工具包
import numpy as np
#HDF5的写入:
imgData = np.zeros((30,3,128,256))
f = h5py.File('HDF5_FILE.h5','w')   #创建一个h5文件,文件指针是f
f['data'] = imgData                 #将数据写入文件的主键data下面
f['labels'] = range(100)            #将数据写入文件的主键labels下面
f.close()                           #关闭文件
 
#HDF5的读取:
f = h5py.File('HDF5_FILE.h5','r')   #打开h5文件
f.keys()                            #可以查看所有的主键
a = f['data'][:]                    #取出主键为data的所有的键值
f.close()
  1. 实际应用:
  • 项目需要一个包含训练图像绝对路径的.h文件, 现在仿照原作者提供的ADE.h5文件进行编写, 首先检查ADE.h5的组成
import h5py

with h5py.File('ADE.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 = h5py.File('ADE.h5', 'r')
a = f["image"][:]  # 取出主键为image的所有的键值
print(a)
f.close()

输出如下, 可以看出这个h5文件中有一个名为imag的文件(dataset)

<HDF5 dataset "image": shape (15417,), type "|S117"> image /image
[b'/vision/vision_rhgao/ADE/ADE20K_2016_07_26/images/training/c/childs_room/ADE_train_00005532.jpg'
 b'/vision/vision_rhgao/ADE/ADE20K_2016_07_26/images/training/c/childs_room/ADE_train_00005531.jpg'
 b'/vision/vision_rhgao/ADE/ADE20K_2016_07_26/images/training/c/childs_room/ADE_train_00005530.jpg'
 ...
 b'/vision/vision_rhgao/ADE/ADE20K_2016_07_26/images/training/y/yard/ADE_train_00020125.jpg'
 b'/vision/vision_rhgao/ADE/ADE20K_2016_07_26/images/training/y/yard/ADE_train_00020124.jpg'
 b'/vision/vision_rhgao/ADE/ADE20K_2016_07_26/images/training/y/yard/ADE_train_00020123.jpg']
  • 根据以上得到的数据格式, 写.h5文件. 此处注意:函数f.create_dataset对数据的要求是ascii码, 不是unicode, 然而os.listdir()得到的数据类型是list,不能直接list.encode(),需要把里面的数据挨个取出来,转化后再存进去。
with h5py.File("pic.h5", 'a') as f:
    list_ascii = []
    for j in np.array(os.listdir()): # 遍历当前文件夹, 提取文件名称并转换为numpy格式
        list_ascii.append(j.encode())
    f.create_dataset('image', data=list_ascii) 

参考:
https://blog.csdn.net/buchidanhuang/article/details/89716252
https://www.zhihu.com/question/52482257
https://blog.csdn.net/leibaojiangjun1/article/details/53635353

你可能感兴趣的:(python,co)