因pandas的to_hdf5函数有bug TypeError: object of type 'int' has no len(),写dataframe数据出现了报错,遂决定直接使用h5py来写数据。

以下翻译自https://www.h5py.org/

核心概念

h5py包是用于HDF5二进制数据格式的Python接口

HDF5可以让你储存大量数值数据,以及很容易的操作NumPy的数据。比如,你可以将储存在磁盘上多个T大小的数据进行切片,就像他们是真实的Numpy数组一样。数以千计的数据集可以被储存到一个文件,可以根据需要进行分类和标记。

一个HDF5文件是一共包含两种对象的容器:datasets,他们是类似于数组的数据的集合。groups,他们是类似于文件夹的容器,包含了datasets和其他的groups。

何时使用h5py的最基本的事是:

Groups是像字典一样工作,而datasets像NumPy数组一样工作。

假设有人给你发了一个HDF5文件,mytestfile.hdf5. (关于如何创建此文件,请阅读附录:创建文件)您需要做的第一件事就是打开文件进行读取:

>>> import h5py
>>> f = h5p.file('mytestfile.hdf5', 'r')

这个文件对象是你的出发点。这个文件中存储了什么?记得h5py.File文件就像一个Python字典,因此我们可以查看键,

>>> list(f.keys())
['mydataset']

根据我们的观察,文件里有一组数据,mydataset。让我们将这个数据集作为Dataset对象

>>> dset = f['mydataset']

我们得到的对象不是数组,而是HDF5 dataset.与NumPy数组一样,datasets既有形状也有数据类型:

>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')

它们还支持和数组一样的的切片。这就是你读写数据的方式从文件中的数据集:

>>> dset[...] = np.arange(100)
>>> dset[0]
0
>>> dset[10]
10
>>> dset[0:100:10]
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

更多信息,请参见文件对象数据集集合.

附录:创建文件

在这一点上,你可能想知道mytestdata.hdf5文件是如何被创建的。我在file对象初始化时,将mode设置成w。而其他的一些模式是a(用于读/写/创建访问)和r+(用于读/写访问)。

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

这个file对象具有几个有趣的方法。其中一个是create_dataset,顾名思义,是创建给定形状和数据类型的数据集

>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

file对象是一个上下文管理器;所以下面的代码也可以工作

>>> import h5py
>>> import numpy as np
>>> with h5py.File("mytestfile.hdf5", "w") as f:
>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

Groups与分层结构

“HDF”意为“Hierarchical Data Format分层数据格式”。HDF5文件中的每个对象有一个名称,并且它们用 / 分隔符以POSIX风格的层次进行排列:

>>> dset.name
'/mydataset'

这个系统中的“folders”称为groups. 我们创建的file对象本身就是一个group,在本例中是root group,名称为 /:

>>> f.name
'/'

创建子组是通过恰当命名的create_group来实现. 但我们需要先以“append”模式(如果存在,则读/写,否则创建)打开文件:

>>> f = h5py.File('mydataset.hdf5', 'a')
>>> grp = f.create_group("subgroup")

和file对象一样,所有Group对象都具有create_*的方法:

>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')
>>> dset2.name
'/subgroup/another_dataset'

顺便说一句,您不必手动创建所有的中间groups。指定完整路径就可以了:(即所谓的层次创建)

>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
>>> dset3.name
'/subgroup2/dataset_three'

Group支持大多数Python字典样式的接口。使用item-retrieval语法检索文件中的对象:

>>> dataset_three = f['subgroup2/dataset_three']

迭代groups可提供其成员的名称:

>>> for name in f:
... print(name)
mydataset
subgroup
subgroup2
 

还可以使用名称来测试成员是否存在:

>>> "mydataset" in f
True
>>> "somethingelse" in f
False

您甚至可以使用完整的路径名:

>>> "subgroup/another_dataset" in f
True

还有熟悉的keys(), values(), items()和iter()方法,以及get()方法。

因为迭代一个组只会产生其直接连接的成员,对整个文件的迭代是用group方法visit()和visititems(),需要调用:

>>> def printname(name):
... print(name)
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three

更多信息,请参见.

属性

HDF5的一个最好的特性是您可以立即存储元数据它所描述的数据。所有groups和datasets都支持附加一串属性.

属性通过attrs代理对象实现字典接口:

>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True

最新文章

  1. 解决Ubuntu下Chrome浏览器网页中文字体混乱
  2. ex6的选择器
  3. ArrayList、HashTable、List、Dictionary的演化及如何选择使用
  4. 在MAC中安装XMPP服务器
  5. oracle 有关大数据
  6. 深入理解计算机系统第二版习题解答CSAPP 2.14
  7. linux下的openoffice安装和服务自启动
  8. oracle 自动添加序号列 排序
  9. inflate, findViewById与setContentView的区别与联系
  10. 一个loader加载多个swf
  11. 201521123095 《Java程序设计》第2周学习总结
  12. PAT A1134 Vertex Cover (25 分)——图遍历
  13. 【bzoj1565】 NOI2009—植物大战僵尸
  14. 【三分钟视频教程】iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#
  15. mysql -- 优化之ICP(index condition pushdown)
  16. 微信自定义菜单的emoji图标
  17. python sqlite3 入门 (视频讲座)
  18. spark执行命令 监控执行命令
  19. bzoj1800飞行棋
  20. 「6月雅礼集训 2017 Day10」quote

热门文章

  1. Java第四讲动手动脑
  2. IntelliJ IDEA 程序运行的控制台乱码
  3. ASP输出生成Word 、Excel、Txt文件的方法
  4. JavaScript验证API
  5. mysql-8版本优化建议
  6. day11_多态&抽象类&接口
  7. 问题记录——mysql服务忘记root密码后加skip-grant-tables 跳过权限认证参数启动报错处理
  8. Day 13 13.2 requests之请求参数与请求体
  9. DotNetCore2.1镜像上传DockerHub在Docker运行
  10. Web Socket 长连接