HDF5 中的数据存储在数据集中,这些数据集可能是多维的,最多有 32 个维度,每个维度最多为无符号 64 位整数长度(列数),并且包含任意大小的数据类型,包括用于单个数据集的上限超过 16 EB。数据集旨在保存结构化数据,例如 numpy 数组、pandas DataFrames、图像和电子表格。我还没有找到将纯文本或 tar.gz 文件直接放入 HDF5 的任何方法。但是,使用 Python,您可以将文件读入字符串并将其放入数据集中,如 Strings in HDF5 所示。除了数据集,组是 HDF5 中的另一个主要对象类型,是数据集和其他组的容器。数据集和组类似于文件和目录(或文件夹),并为分层格式(如 Unix 文件系统)提供基础,其中可以使用以 / 开头的路径名访问对象。 HDF5 文件是可能包含多个数据集和组的容器,并且没有大小限制。
为了更好地了解 HDF5 是什么,我建议从 HDF5 Downloads 下载它和随附的实用程序以及 HDFView,安装所有内容,然后通过 Learning HDF5 with HDFView,这可以在 30 分钟内完成。 HDFView 是一个 Java GUI,可以轻松与 HDF5 交互,但是您不能简单地将文件拖放到其中,但可以将文件数据导入数据集。创建 HDF5 文件并使用 pandas 向其中添加 DataFrame 非常容易,这是将数据放入 HDF5 文件的好方法。下面是一个演示。有关 HDF5 的更多信息,您可以查看HDF5 Tutorials、HDF5 Python Examples by API、Additional HDF5 Python Examples 上列出的其他教程以及HDF5 for Python 上的 Python h5py 包文档。有关 pandas 的更多信息,10 Minutes to pandas 是一个很好的起点,接下来是 pandas Cookbook 的一系列代码示例和 Wes McKinney 的 Python for Data Analysis,这是自他发明和开发了大部分 Pandas 以来最好的关于 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()