HDF(Hierarchical Data Format)指一種爲存儲和處理大容量科學數據設計的文件格式及相應庫文件。HDF 最先由美國國家超級計算應用中心 NCSA 開發,目前在非盈利組織 HDF 小組維護下繼續發展。當前流行的版本是 HDF5。HDF5 擁有一系列的優異特性,使其特別適合進行大量科學數據的存儲和操做,如它支持很是多的數據類型,靈活,通用,跨平臺,可擴展,高效的 I/O 性能,支持幾乎無限量(高達 EB)的單文件存儲等。html
HDF5文件層次化的存儲兩類對象:python
這兩類對象均可以設置各類屬性,屬性用於描述group和dataset的一些特色。一個HDF5文件從一個命名爲「/」的group開始,一個HDF5文件只有一個根group。數組
用 h5py 操做 HDF5 文件,咱們能夠像使用目錄同樣使用 group,像使用 numpy 數組同樣使用 dataset,像使用字典同樣使用屬性,很是方便和易用。dom
class File(name, mode=None, driver=None, libver=None, userblock_size=None, **kwds)
打開或建立一個 HDF5 文件,name 爲文件名字符串,mode 爲打開文件的模式,driver 能夠指定一種驅動方式,如需進行並行 HDF5 操做,可設置爲 'mpio',libver 能夠指定使用的兼容版本,默認爲 'earliest',也能夠指定爲 'latest',userblock_size 以字節爲單位指定一個在文件開頭稱做 user block 的數據塊,通常不須要設置。返回所打開文件的句柄。ide
mode | 說明 |
---|---|
r | 只讀,文件必須存在 |
r+ | 讀寫,文件必須存在 |
w | 建立新文件寫,已經存在的文件會被覆蓋掉 |
w- | / x 建立新文件寫,文件若是已經存在則出錯 |
a | 打開已經存在的文件進行讀寫,若是不存在則建立一個新文件讀寫,此爲默認的 mode |
create_group(self, name, track_order=False)
建立一個新的 group。以相似目錄路徑的形式指明所建立 group 的名字 name,若是 track_order 爲 True,則會跟蹤在當前 group 下的 group 和 dataset 建立的前後順序。該方法能夠在打開的文件句柄(至關於 "/" group)或者一個存在的 group 對象上調用,此時 name 的相對路徑就是相對於此 group 的。性能
create_dataset(self, name, shape=None, dtype=None, data=None, **kwds)
建立一個新的 dataset。以相似文件路徑的形式指明所建立 dataset 的名字 name,shape 以一個 tuple 或 list 的形式指明建立 dataset 的 shape,用 "()" 指明標量數據的 shape,dtype 指明所建立 dataset 的數據類型,能夠爲 numpy dtype 或者一個代表數據類型的字符串,data 指明存儲到所建立的 dataset 中的數據。若是 data 爲 None,則會建立一個空的 dataset,此時 shape 和 dtype 必須設置;若是 data 不爲 None,則 shape 和 dtype 能夠不設置而使用 data 的 shape 和 dtype,可是若是設置的話,必須與 data 的 shape 和 dtype 兼容。ui
打開的文件句柄(至關於 "/" group),group 和 dataset 上均可以建立 attribute,以相似於字典的操做方式建立和讀取 attribute。設計
示例代碼一:code
import h5py import numpy as np X = np.random.rand(1, 10, 4).astype('float32') y = np.random.rand(1, 10, 5).astype('float32') h5f = h5py.File('data.h5', 'w') # 以寫模式打開文件 h5f.create_dataset('X_train', data=X) # 添加數據集 h5f.create_dataset('y_train', data=y) # 添加數據集 h5f.close() h5f = h5py.File('data.h5', 'r') # 以讀模式打開文件 X = h5f['X_train'] # 經過下標方式獲取數據集 Y = h5f['y_train'] h5f.close()
示例代碼二:orm
import os import h5py import numpy as np file_name = 'test.hdf5' # create a new HDF5 file f = h5py.File(file_name) # create a new group f.create_group('/grp1') # or f.create_group('grp1') # create a nother group inside grp1 f.create_group('/grp1/grp2') # or f.create_group('grp1/grp2') # create a dataset in group "/" data = np.arange(6).reshape(2, 3) f.create_dataset('dset1', data=data) # or f.create_dataset('/dset1', data=data) # create another dataset in group /grp1 f.create_dataset('grp1/dset2', data=data) # or f.create_dataset('/grp1/dset2', data=data) # create an attribute of "/" f.attrs['a'] = 1 # or f.attrs['/a'] = 1 # create an attribute of group "/grp1" f['grp1'].attrs['b'] = 'xyz' # create an attribute of dataset "/grp1/dset2" f['grp1/dset2'].attrs['c'] = np.array([1, 2]) # close file f.close() # open the existing test.hdf5 for read only f = h5py.File(file_name, 'r') # read dataset /dset1 print('/dset1 = %s' % f['dset1'][:]) # read dataset /grp1/dset2 print('/grp1/dset2 = %s' % f['/grp1/dset2'][:]) # get attributes print(f.attrs['a']) print(f['grp1'].attrs['b']) print(f['grp1/dset2'].attrs['c']) # remove the created file os.remove(file_name)
示例代碼三:
import h5py import numpy as np file_name = 'test.hdf5' f = h5py.File(file_name, mode='w') data = np.array([1, 2, 3]) f['/one'] = data f.attrs['one'] = 'haha' print(f.attrs.keys()) print(f['one']) print(f.attrs['one'])