HDF5中的数据存储在数据集中,这些数据集是同质数组,可能是多维的,每个数组最多有32个维度,每个维度最多具有无符号64位整数长度(列数),包含任意大小的数据类型,包括上限为超过16 exabytes的单个数据集的复合数据类型。数据集旨在保存结构化数据,例如numpy数组、pandas DataFrame、图像和电子表格。我没有找到直接将纯文本或tar.gz文件放入HDF5的方法。但是,使用Python可以将文件读入字符串,并将其作为数据集放入,如
Strings in HDF5所示。除了数据集外,组是HDF5中的另一种重要对象类型,它们是数据集和其他组的容器。数据集和组类似于文件和目录(或文件夹),提供了类似Unix文件系统的分层格式,其中可以使用以/开头的路径名访问对象。HDF5文件是可能包含多个数据集和组的容器,没有大小限制。
为了更好地了解HDF5是什么,我建议您下载它和附带的实用程序以及来自
HDF5 Downloads的HDFView,安装所有内容,然后通过
Learning HDF5 with HDFView进行学习,这可以在30分钟内完成。 HDFView是一个Java GUI,使得与HDF5互动变得容易,但您不能简单地将文件拖放到其中,但是可以将文件数据导入数据集中。使用pandas创建HDF5文件并向其中添加DataFrame非常容易,这是将数据放入HDF5文件的好方法。下面是演示。有关HDF5的更多信息,您可以查看
HDF5 Tutorials上列出的其他教程,
HDF5 Python Examples by API,
Additional HDF5 Python Examples和Python h5py包文档
HDF5 for Python。有关pandas的更多信息,请从
10 Minutes to pandas开始,然后转到
pandas Cookbook获取一系列代码示例,以及Wes McKinney的
Python for Data Analysis,这是有关pandas的最佳教程,因为他发明和开发了大部分内容,并且是一位优秀的作者。
这是使用pandas创建HDF5文件的示例,将DataFrame加载到其中,并检索并存储其副本到另一个变量中:
In [193]: import pandas as pd
In [194]: frame = pd.read_csv('test.csv')
In [195]: frame
Out[195]:
a b c d message
0 1 2 3 4 one
1 5 6 7 8 two
2 9 10 11 12 three
In [196]: type(frame)
Out[196]: pandas.core.frame.DataFrame
In [197]: hdf5store = pd.HDFStore('mydata.h5')
In [198] %ls mydata.h5
Volume in drive C is OS
Volume Serial Number is 5B75-665D
Directory of C:\Users\tn\Documents\python\pydata
09/02/2015 12:41 PM 0 mydata.h5
1 File(s) 0 bytes
0 Dir(s) 300,651,331,584 bytes free
In [199]: hd5store['frame'] = frame
In [200]: hdf5store
Out[200]:
<class 'pandas.io.pytables.HDFStore'>
File path: mydata.h5
/frame frame (shape->[3,5])
In [201]: list(hdf5store.items())
Out[201]:
[('/frame', /frame (Group) ''
children := ['block0_values' (Array), 'block0_items' (Array), 'axis1' (Array), 'block1_items' (Array), 'axis0' (Array), 'block1_values' (VLArray)])]
In [202]: hdf5store.close()
现在展示从mydata.h5中检索帧的能力:
In [203]: hdf5store2 = pd.HDFStore('mydata.h5')
In [204]: list(hdf5store2.items())
Out[204]:
[('/frame', /frame (Group) ''
children := ['block0_values' (Array), 'block0_items' (Array), 'axis1' (Array), 'block1_items' (Array), 'axis0' (Array), 'block1_values' (VLArray)])]
In [205]: framecopy = hdf5store2['frame']
In [206]: framecopy
Out[206]:
a b c d message
0 1 2 3 4 one
1 5 6 7 8 two
2 9 10 11 12 three
In [207]: framecopy == frame
Out[207]:
a b c d message
0 True True True True True
1 True True True True True
2 True True True True True
In [208]: hdf5store2.close()