Python数据存储之 h5py

1、Python数据存储(压缩)

(1)numpy.save , numpy.savez , scipy.io.savemat
numpy和scipy内建的数据存储方式。
(2)cPickle + gzip
cPickle是pickle内建的数据存储方式,gzip是常用的文件压缩模块。
(3)h5py
h5py是对HDF5文件格式进行读写的python包,关于h5py更多介绍与安装,参考官方网站
关于HDF5,参考官方网站http://docs.h5py.org/en/latest/index.html

一个HDF5文件就是一个由两种基本数据对象(groups and datasets)存放多种科学数据的容器:

  HDF5 dataset: 数据元素的一个多维数组以及支持元数据(metadata);
  HDF5 group: 包含0个或多个HDF5对象以及支持元数据(metadata)的一个群组结构;

总之,dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group;group和dataset在h5py中的使用有点类似于词典和Numpy中数组的用法。

h5py的优势:速度快、压缩效率高,总之,numpy.savez和cPickle存储work或不work的都可以试一试h5py!

2、h5py简介

h5py文件是存放两类对象的容器,数据集(dataset)和组(group),dataset类似数组类的数据集合,和numpy的数组差不多。group是像文件夹一样的容器,它好比python中的字典,有键(key)和值(value)。group中可以存放dataset或者其他的group。”键”就是组成员的名称,”值”就是组成员对象本身(组或者数据集),下面来看下如何创建组和数据集。

1. 创建一个h5py文件

import h5py
#要是读取文件的话,就把w换成r
f=h5py.File("myh5py.hdf5","w")

在当前目录下会生成一个myh5py.hdf5文件

2. 创建dataset数据集

import h5py
f=h5py.File("myh5py.hdf5","w")
#deset1是数据集的name,(20,)代表数据集的shape,i代表的是数据集的元素类型
d1=f.create_dataset("dset1", (20,), 'i')
for key in f.keys():
    print(key)
    print(f[key].name)
    print(f[key].shape)
    print(f[key].value)

输出:
dset1
/dset1
(20,)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

这里我们仅仅创建了一个存放20个整型元素的数据集,并没有赋值,默认全是0,如何赋值呢,看下面的代码。

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")

d1=f.create_dataset("dset1",(20,),'i')
#赋值
d1[...]=np.arange(20)
#或者我们可以直接按照下面的方式创建数据集并赋值
f["dset2"]=np.arange(15)

for key in f.keys():
    print(f[key].name)
    print(f[key].value)

输出:
/dset1
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
/dset2
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

如果我们有现成的numpy数组,那么可以在创建数据集的时候就赋值,这个时候就不必指定数据的类型和形状了,只需要把数组名传给参数data。

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
a=np.arange(20)
d1=f.create_dataset("dset1",data=a)
for key in f.keys():
    print(f[key].name)
    print(f[key].value)

输出:
/dset1
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

现在把这几种创建的方式混合写下。看下面的代码

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
#分别创建dset1,dset2,dset3这三个数据集
a=np.arange(20)
d1=f.create_dataset("dset1",data=a)

d2=f.create_dataset("dset2",(3,4),'i')
d2[...]=np.arange(12).reshape((3,4))

f["dset3"]=np.arange(15)

for key in f.keys():
    print(f[key].name)
    print(f[key].value)

输出:
/dset1
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
/dset2
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
/dset3
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

3. 创建group组

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")

#创建一个名字为bar的组
g1=f.create_group("bar")

#在bar这个组里面分别创建name为dset1,dset2的数据集并赋值。
g1["dset1"]=np.arange(10)
g1["dset2"]=np.arange(12).reshape((3,4))

for key in g1.keys():
    print(g1[key].name)
    print(g1[key].value)

输出:
/bar/dset1
[0 1 2 3 4 5 6 7 8 9]
/bar/dset2
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

注意观察数据集dset1和dset2的名字是不是有点和前面的不一样,如果是直接创建的数据集,不在任何组里面,那么它的名字就是/+名字,现在这两个数据集都在bar这个group(组)里面,名字就变成了/bar+/名字,是不是有点文件夹的感觉!继续看下面的代码,你会对group和dataset的关系进一步了解。

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")

#创建组bar1,组bar2,数据集dset
g1=f.create_group("bar1")
g2=f.create_group("bar2")
d=f.create_dataset("dset",data=np.arange(10))

#在bar1组里面创建一个组car1和一个数据集dset1。
c1=g1.create_group("car1")
d1=g1.create_dataset("dset1",data=np.arange(10))

#在bar2组里面创建一个组car2和一个数据集dset2
c2=g2.create_group("car2")
d2=g2.create_dataset("dset2",data=np.arange(10))

#根目录下的组和数据集
print(".............")
for key in f.keys():
    print(f[key].name)

#bar1这个组下面的组和数据集
print(".............")
for key in g1.keys():
    print(g1[key].name)


#bar2这个组下面的组和数据集
print(".............")
for key in g2.keys():
    print(g2[key].name)

#顺便看下car1组和car2组下面都有什么,估计你都猜到了为空。
print(".............")
print(c1.keys())
print(c2.keys())

输出:
.............
/bar1
/bar2
/dset
.............
/bar1/car1
/bar1/dset1
.............
/bar2/car2
/bar2/dset2
.............
[]
[]

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/82226884