h5文件格式,HDF 的版本 5(HDF 版本 5不與 HDF 版本 4 及早期版本兼容).HDF是什么呢?就是Hierarchical Data Format,可以存儲不同類型的圖像和數碼數據的文件格式,並且可以在不同類型的機器上傳輸,同時還有統一處理這種文件格式的函數庫。大多數普通計算機都支持這種文件格式。
美國國家高級計算應用中心(National Center for Supercomputing Application,NCSA)為了滿足各種領域研究需求而研制的一種能高效存儲和分發科學數據的新型數據格式 。HDF可以表示出科學數據存儲和分布的許多必要條件。
HDF的優點有:
自述性:對於一個HDF文件里的每一個數據對象,有關於該數據的綜合信息(元數據)。在沒有任何外部信息的情況下,HDF允許應用程序解釋HDF文件的結構和內容。
通用性:許多數據類型都可以被嵌入在一個HDF文件里。例如,通過使用合適的HDF數據結構,符號、數字和圖形數據可以同時存儲在一個HDF文件里。
靈活性:HDF允許用戶把相關的數據對象組合在一起,放到一個分層結構中,向數據對象添加描述和標簽。它還允許用戶把科學數據放到多個HDF文件里。
擴展性:HDF極易容納將來新增加的數據模式,容易與其他標准格式兼容。
跨平台性:HDF是一個與平台無關的文件格式。HDF文件無需任何轉換就可以在不同平台上使用。
HDF的文件格式:
HDF格式可以被看成一本帶目錄的多章節書。HDF文件作為“數據書”,每一章包含不同類型的數據元素。HDF文件用“數據目錄”列出數據元素。
一個HDF 文件應包括一個文件頭,一個或多個描述符塊,若干個數據元素。
數據頭是用來確定一個文件是否為HDF文件,描述符塊存有數據描述符的序號。一個數據描述符和數據元素一起組成了數據對象。數據對象是HDF 的基本結構。
文件頭:
文件頭占用文件的前4個字節,它由4個ASCII碼形式的控制字符組成,每個字符占用一個字節。第一個控制字符是‘N’,第二個是‘C’, 第三個是‘S’,第四為‘A’,即(^N^C^S^A).
數據對象:
一個數據對象是由一個數據描述符和一個數據元素組成。數據描述符包含了數據元素的類型、位置、尺度等信息。數據元素是實際的數據資料。HDF 這種數據組織方式可以實現HDF 數據的自我描述。
(1) 數據描述符
所有的數據描述符都為12個字節長,它包含4個區域:標識符(占16-bit),參照數(16-bit),數據偏移量(32-bit),數據長度(32-bit)。
標識符:
數據標識符(tag)是用來確定數據元素區數據類型的。它是16位無符號整型值(1~65535),如果沒有與其相對應的數據元素,則tag為DFTGA_NULL(或0)。下面為tag的值的說明:
1~32767——HDF 結構專用
32768~64999——可由用戶定義
65000~65535——HDF 規格擴展使用
參照數:
對於HDF 文件中的每個標記符,都有唯一的一個參照數與其相對應。參照數是一個16—bit無符號整型數,在數據對象中一般是不可變的。標記符和參照數相結合確定唯一的數據對象。
數據偏移量和長度:
數據偏移量是指從文件開始位置到數據元素的起始位置所包含的字節數。長度是指整個數據元素區占用字節數。數據偏移量和長度均為32-bit 無符號整型數。
(2) 數據元素
數據元素是數據對象中的裸數據部分。
(3) 在HDF 文件中將數據對象分組
在HDF 文件中通常將含有相關數據的數據對象分為一組。這些數據對象組稱為數據集。HDF 用戶采用應用界面來處理這些數據集。例如:一套8-bit的圖像數據集一般有3個數據對象:一組對象用來描述數據集的成員,一組對象是圖像數據,另一組對象則用來描述圖像的尺度大小。一個數據對象可以同時屬於多個數據集,例如包含在一個柵格圖像中的調色板對象,如果它的標識號和參照值也同時包含在另一個數據集描述符中,那么則可以被另一個柵格圖像調用。
python的代碼讀寫實現:
# -*- coding: utf-8 -*- import h5py import numpy as np #HDF5的寫入: imgData = np.zeros((2,4)) f = h5py.File('HDF5_FILE.h5','w') #創建一個h5文件,文件指針是f f['data'] = imgData #將數據寫入文件的主鍵data下面 f['labels'] = np.array([1,2,3,4,5]) #將數據寫入文件的主鍵labels下面 f.close() #關閉文件 #HDF5的讀取: f = h5py.File('HDF5_FILE.h5','r') #打開h5文件 # 可以查看所有的主鍵 for key in f.keys(): print(f[key].name) print(f[key].shape) print(f[key].value)
備忘:
錯誤: ImportError: No module named h5py的解決方法:
sudo apt-get install libhdf5-dev
sudo apt-get install python-h5py
參考文檔:
1 https://baike.baidu.com/item/hdf%E6%96%87%E4%BB%B6/2590190