【python基础】HDF5之数据存储

HDF5是一种文件压缩格式,全称为Hierarchical Data Format。具有读写速度快,内存占用少,压缩率很高。因此在计算机视觉、医学图像处理领域推荐使用。

HDF5python中的使用主要依赖于h5py这个包。因此,在使用之前应该先进行安装。

HDF5主要的对象有两种:datasetsgroupsdatasets类似于numpy数组类型,而groups则类似于python中的字典类型。


具体的使用方法,先看一段代码:

import h5py
import numpy as np

# 定义变量
my_name = 'JianJuly'.encode('utf-8')
my_school = 'USTC'.encode('utf-8')
my_birthday = np.array([1990, 10, 18])
my_age = 18

# 写入HDF5
f = h5py.File('student.h5','w')
f.create_dataset('name', data=my_name)
f['school'] = my_school
f.create_dataset('birthday', data=my_birthday)
f.create_dataset('age', data=my_age)
f.close()

# 读取HDF5
g = h5py.File('student.h5','r')
real_name = g['name'].value.decode('utf-8')
real_school = g['school'][()].decode('utf-8')
real_age = g['age'].value
real_birthday = g['birthday'][()]
g.close()
print('===============summarise=========================')
print('my name is {}'.format(real_name))
print('my school is {}'.format(real_school))
print('my birthday is {0[0]}, {0[1]}, {0[2]}'.format(real_birthday))
print('my age is {}'.format(real_age))

输出:

===============summarise=========================
my name is JianJuly
my school is USTC
my birthday is 1990, 10, 18
my age is 18

几点注释:

  1. 第五行:使用了encode函数,因为HDF5的数据类型是类似于numpy的,如果想用它来存储字符串,必须对字符串进行编码。在这里我们使用了utf-8的编码格式。关于编码的更多知识,可参见【理解计算机】字符编码:ASCII,Unicode 和 UTF-8一节;
  2. 第十一行:打开hdf5文件时,有多种模式可供选择。最常用的是rw,分别代表读和写。 以w方式打开文件时,如果文件不存在,则新建一个;
    【python基础】HDF5之数据存储_第1张图片
  3. 第十二行:写入数据的时候,可以使用create_dataset方法。其中name为键名,my_name为键值;
  4. 第十三行:写入数据的时候,也可以直接使用类似于字典的方法;
  5. 第十六行:写入完毕后,记得关闭文件;
  6. 第二十行:读取数据的时候,使用类似于字典的方法,通过关键字读取。通过value方法获取键值,通过调用decode对字符串进行解码
  7. 第二十三行:也可以使用[()]方法获取该键的键值。

hdf5的读写封装成函数

import h5py


def load_hdf5(infile):
    with h5py.File(infile,"r") as f:
         return f["image"][()]

def write_hdf5(arr,outfile):
  with h5py.File(outfile,"w") as f:
    f.create_dataset("image", data=arr, dtype=arr.dtype)
  1. 数据存储的键名为image
  2. arr为需要存储的数据,应位numpy数组,因为普通的python数据类型没有dtype属性;
  3. infileoutfile为文件名。

你可能感兴趣的:(python)