【python基礎】HDF5之資料儲存
阿新 • • 發佈:2019-02-09
HDF5
是一種檔案壓縮格式,全稱為Hierarchical Data Format
。具有讀寫速度快,記憶體佔用少,壓縮率很高。因此在計算機視覺、醫學影象處理領域推薦使用。
HDF5
在python
中的使用主要依賴於h5py
這個包。因此,在使用之前應該先進行安裝。
HDF5
主要的物件有兩種:datasets
和groups
。datasets
類似於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
幾點註釋:
- 第五行:使用了
encode
函式,因為HDF5的資料型別是類似於numpy
的,如果想用它來儲存字串,必須對字串進行編碼。在這裡我們使用了utf-8
的編碼格式。關於編碼的更多知識,可參見【理解計算機】字元編碼:ASCII,Unicode 和 UTF-8一節; - 第十一行:開啟
hdf5
檔案時,有多種模式可供選擇。最常用的是r
和w
,分別代表讀和寫。 以w
方式開啟檔案時,如果檔案不存在,則新建一個;
- 第十二行:寫入資料的時候,可以使用
create_dataset
方法。其中name
為鍵名,my_name
為鍵值; - 第十三行:寫入資料的時候,也可以直接使用類似於字典的方法;
- 第十六行:寫入完畢後,記得關閉檔案;
- 第二十行:讀取資料的時候,使用類似於字典的方法,通過關鍵字讀取。通過
value
方法獲取鍵值,通過呼叫decode
對字串進行解碼 - 第二十三行:也可以使用
[()]
方法獲取該鍵的鍵值。
將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)
- 資料儲存的鍵名為
image
; arr
為需要儲存的資料,應位numpy
陣列,因為普通的python
資料型別沒有dtype
屬性;infile
和outfile
為檔名。