hdf5类型文件

HDF---Hierarchical Data Format的简称,

hdf5是一种高级的适合大数据存储及层次逻辑数据的存储文件类型,而list及dict是数据类型.
层次结构数据,满足层次存储及索引包括:

  1. group------------------像字典
  2. dataset-------------像numpy数组

安装后使用报错:通过pip install h5py==2.8.0rc1更新

对于数据集需要:
先创建h5文件,再去读h5文件
将dataset放在group里利用group进行层次嵌套.

f = filename.file得到文件的根目录
f.create_group("...../group_name")
f.create_dataset("...../dataset_name")

打开文件的模式,决定是不是可以写,读等

  1. r---只读...

  2. w----文件不存在就新建,存在就清空,

  3. a---文件已存在就在基础上写或读,否则新建,

    直接遍历一级目录名:正常迭代打印就好
    层级树状递归完全遍历:visit
    内部的属性赋值.attr["temp"] = 25 cellius

    对于创建的group或dataset对象可以用.name打印绝对路径: /foo/grp1

一般:

  1. HDF5格式文件保存的是 : Model weights(字典,没有顺序)
  2. JSON 和 YAML 格式文件保存的是: Model structure(顺序靠json描述)
  3. h5格式:可以同时保存weights和structure

底层存储方式

hdf5默认存储是连续的,c类型的内存.chunked格式变成分块存储可以变成不连续,但是每个块内的数据是连续的.

利用numpy数据初始化

#还可以直接用np数组给dataset初始化,此时data就涵盖了shape和dtype,即shape = data.shape,....
arr = np.arange(100)
dset = f.create_dataset("/mydataset1",data = arr)#i4:32位的integer[-2^31,2^31]

数据处理上的用途

利用python的文件操作及数组等方式将训练数据及测试数据集标签,按数据划分方法,将文件名写入到python数组,最终将这些处理好的数组写入hdf5格式文件给dataset初始化.

示例

import h5py
import numpy as np
coco = h5py.File("D:/annot_coco.h5","r")#coco.name == / 根节点
# print(coco)
# print(coco["bndbox"])
#只是遍历直接相连的一级节点
for name in coco:
    # 本身就是字符串
    print(coco[name])
    print(coco[name][:2])

# def printname(name):
#     print(name)
#
#
#
# #遍历整个coco下的节点
# coco.visit(printname)
#dataset.attrs
#dataset对象可以有自己的属性, 但所有属性数据的长度加起来不能超过64K, 包括属性名字.

dset.attrs['length'] = 100
dset.attrs['name'] = 'This is a dataset'
for attr in dset.attrs:
    print attr, ":", dset.attrs[attr]
length : 100
name : This is a dataset

注意:

imgname_array = coco["imgname"][:]#不一样的,这是标准用法,还是要先取到全部,再去索引,否则结果维度不一样
# imgname_ = coco["imgname"][:1]#轴不会减少
# print(imgname_array.shape)
# print(imgname_)#[1,16]
# print(type(imgname_dataset))
# print(type(imgname_array))
img = imgname_array[0]

写字符串到h5文件

test_h5 = h5py.File("D:/test.h5","w")
imgname = np.fromstring('000000262145.jpg',dtype=np.uint8).astype('float64')#str_imgname------>float64
test_h5 .create_dataset('imgname', data=imgname)#变成f8之后就可以直接往h5中写了
test_h5.close()
"""
最后得出来的矩阵长度是字符串的长度。---1个字符串的长度就是对应编码的h5向量的长度
如果想将多个字符串拼成一个大的numpy矩阵,写到h5文件中,必须先将字符串转换成相同长度。
通常的做法是在字符串后面补上\x00。
"""

从h5数据读出字符串格式

test_h5 = h5py.File("D:/test.h5","r")
img = test_h5['imgname'][:]
img = img.astype(np.uint8).tostring().decode('ascii')
print(img)
test_h5.close()
posted @ 2020-10-28 18:19  Parallax  阅读(1373)  评论(0编辑  收藏  举报