1. 程式人生 > >【python基礎】HDF5之資料儲存

【python基礎】HDF5之資料儲存

HDF5是一種檔案壓縮格式,全稱為Hierarchical Data Format。具有讀寫速度快,記憶體佔用少,壓縮率很高。因此在計算機視覺、醫學影象處理領域推薦使用。

HDF5python中的使用主要依賴於h5py這個包。因此,在使用之前應該先進行安裝。

HDF5主要的物件有兩種:datasetsgroupsdatasets類似於numpy陣列型別,而groups則類似於python中的字典型別。

具體的使用方法,先看一段程式碼:

import h5py
import numpy as np

# 定義變數
my_name = 'JianJuly'.encode('utf-8'
) my_school = 'USTC'.encode('utf-8') my_birthday = np.array([1990, 10, 18]) my_age = 18 # 寫入HDF5 f = h5py.File('student.h5','w') f.create_dataset('name', data=my_name) f['school'] = my_school f.create_dataset('birthday', data=my_birthday) f.create_dataset('age', data=my_age) f.close() # 讀取HDF5 g = h5py.File('student.h5'
,'r') real_name = g['name'].value.decode('utf-8') real_school = g['school'][()].decode('utf-8') real_age = g['age'].value real_birthday = g['birthday'][()] g.close() print('===============summarise=========================') print('my name is {}'.format(real_name)) print('my school is {}'.format(real_school)) print('my birthday is {0[0]}, {0[1]}, {0[2]}'
.format(real_birthday)) print('my age is {}'.format(real_age))

輸出:

===============summarise=========================
my name is JianJuly
my school is USTC
my birthday is 1990, 10, 18
my age is 18

幾點註釋:

  1. 第五行:使用了encode函式,因為HDF5的資料型別是類似於numpy的,如果想用它來儲存字串,必須對字串進行編碼。在這裡我們使用了utf-8的編碼格式。關於編碼的更多知識,可參見【理解計算機】字元編碼:ASCII,Unicode 和 UTF-8一節;
  2. 第十一行:開啟hdf5檔案時,有多種模式可供選擇。最常用的是rw,分別代表讀和寫。 以w方式開啟檔案時,如果檔案不存在,則新建一個;
    這裡寫圖片描述
  3. 第十二行:寫入資料的時候,可以使用create_dataset方法。其中name為鍵名,my_name為鍵值;
  4. 第十三行:寫入資料的時候,也可以直接使用類似於字典的方法;
  5. 第十六行:寫入完畢後,記得關閉檔案;
  6. 第二十行:讀取資料的時候,使用類似於字典的方法,通過關鍵字讀取。通過value方法獲取鍵值,通過呼叫decode對字串進行解碼
  7. 第二十三行:也可以使用[()]方法獲取該鍵的鍵值。

hdf5的讀寫封裝成函式

import h5py


def load_hdf5(infile):
    with h5py.File(infile,"r") as f:
         return f["image"][()]

def write_hdf5(arr,outfile):
  with h5py.File(outfile,"w") as f:
    f.create_dataset("image", data=arr, dtype=arr.dtype)
  1. 資料儲存的鍵名為image
  2. arr為需要儲存的資料,應位numpy陣列,因為普通的python資料型別沒有dtype屬性;
  3. infileoutfile為檔名。