h5py是Python語言用來操作HDF5的模塊很澄。下面的文章主要介紹h5py的快速入門指南暗甥,翻譯自h5py的官方文檔:http://docs.h5py.org/en/latest/quick.html 挖腰。該翻譯僅為個人學(xué)習(xí)h5py為目的屡穗,如有翻譯不當(dāng)之處,請速聯(lián)系筆者或提供正確的翻譯番枚,非常感謝法严!
安裝
conda install h5py
用Enthought Canopy,可以使用GUI安裝包安裝或用
enpkg h5py
安裝葫笼。用pip或setup.py安裝深啤,請參考安裝方式。
核心概念
一個HDF5文件就是一個容器路星,用于儲存兩類對象:datasets溯街,類似于數(shù)組的數(shù)據(jù)集合;groups洋丐,類似于文件夾的容器呈昔,可以儲存datasets和其它groups。當(dāng)使用h5py時垫挨,最基本的準則為:
groups類似于字典(dictionaries)韩肝,dataset類似于Numpy中的數(shù)組(arrays)。
假設(shè)有人給你發(fā)送了一個HDF5文件九榔, mytestfile.hdf5(如何創(chuàng)建這個文件,請參考:附錄:創(chuàng)建一個文件).首先你需要做的就是打開這個文件用于讀取數(shù)據(jù):
>>> import h5py
>>> f = h5py.File('mytestfile.hdf5', 'r')
這個File對象是你的起點涡相。那么這個文件中儲存了什么呢哲泊?記住,h5py.File就像一個Python字典催蝗,因此我們可以查看這些鍵值切威,
>>> list(f.keys())
['mydataset']
根據(jù)我們的觀察,這個文件中有一個dataset丙号,即mydataset. 讓我們把這個dataset作為Dataset對象來檢驗
>>> dset = f['mydataset']
我們得到的這個對象不是一個數(shù)組先朦,而是一個HDF5 dataset. 就像Numpy中的數(shù)據(jù)那樣缰冤,datasets有形狀(shape)和數(shù)據(jù)類型(data type)
>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')
同時它們也支持數(shù)組風(fēng)格的切片操作。下面是你如何完成這個文件中的一個dataset的讀寫的方法
>>> 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])
想要更多參考喳魏,請前往File Objects和Datasets.
附錄:創(chuàng)建一個文件
此時此刻棉浸,你也許會好奇mytestdata.hdf5是如何創(chuàng)建的。當(dāng)File對象初始化后刺彩,我們通過將模式(mode)設(shè)置為w來創(chuàng)建一個文件迷郑。其它模式(mode)為a(用于讀、寫创倔、新建)和r+(用于讀嗡害、寫)。一個完整的File模式以及它們的含義的列表可參考File對象畦攘。
>>> import h5py
>>> import numpy as np
>>> f = h5py.File("mytestfile.hdf5", "w")
File對象有幾個看上去挺有趣的方法霸妹。其一為create_dataset,顧名思義知押,就是通過給定形狀和數(shù)據(jù)類型來創(chuàng)建一個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和分層結(jié)構(gòu)
“HDF”是“Hierarchical Data Format”的縮寫朗徊。每個HDF5文件中的對象都有一個名字(name)首妖,它們以類似于POSIX風(fēng)格的分層結(jié)構(gòu)存放,用/分隔符分隔
>>> dset.name
u'/mydataset'
在這個系統(tǒng)中“文件夾”(folders)被命名為groups. 我們創(chuàng)建的File對象本身也是一個group, 在這種情形下是根group(root group)爷恳,名字為/:
>>> f.name
u'/'
創(chuàng)建一個子group(subgroup)可以通過一個巧妙的命令create_group來完成有缆。但是,我們首先需要以讀/寫模式來打開文件
>>> f = h5py.File('mydataset.hdf5', 'r+')
>>> grp = f.create_group("subgroup")
所有Group對象温亲,如同F(xiàn)ile對象一樣棚壁,也有create_*方法:
>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')
>>> dset2.name
u'/subgroup/another_dataset'
順便說一句,你不需要手動地創(chuàng)建所有的中間groups. 指定一個完整的路徑同樣可行
>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
>>> dset3.name
u'/subgroup2/dataset_three'
Groups支持大部分的Python字典風(fēng)格的接口栈虚。你可以使用條目獲刃渫狻(item-retrieval)的語法來獲取這個文件中的對象:
>>> dataset_three = f['subgroup2/dataset_three']
迭代一個group,就會產(chǎn)生它的成員的名字:
>>> for name in f:
... print name
mydataset
subgroup
subgroup2
成員關(guān)系檢測也可以通過使用名字來實現(xiàn):
>>> "mydataset" in f
True
>>> "somethingelse" in f
False
你甚至可以使用完整的路徑的名字:
>>> "subgroup/another_dataset" in f
True
它也有你熟悉的keys(), values(), items() 和iter() 的方法魂务,以及get()方法曼验。
因為迭代一個group只會產(chǎn)生它的直屬成員,所以想要迭代一個完整的文件粘姜,可以使用Group的方法visit()和visititems(), 它們通過一個調(diào)用(callable)來實現(xiàn):
>>> def printname(name):
... print name
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three
想要更多參考鬓照,請前往Groups.
屬性
HDF5的最好特征之一就是你可以在描述的數(shù)據(jù)后儲存元數(shù)據(jù)(metadata)。所有的groups和datasets都支持幾個數(shù)據(jù)位的附屬命名孤紧,稱為屬性豺裆。(All groups and datasets support attached named bits of data called attributes.)
屬性可以通過attrs這個代理對象來獲取,這會再一次執(zhí)行字典接口:
>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True
想要更多參考号显,請前往Attributes.
注意:本人現(xiàn)已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape)臭猜, 歡迎大家關(guān)注哦~~