2 回答

TA貢獻1906條經驗 獲得超3個贊
只需迭代鍵列表:
with h5py.File(data_path, 'r') as f:
alist = []
ls = list(f.keys())
print('List of datasets: \n', ls)
for key in ls:
group = f.get(key)
dataset = group.get(datasetname)[:]
print('Shape of dataset: \n', dataset.shape)
alist.append(dataset)
# don't need f.close() in a with
沒有allgroups; 有 iter 和 visit 方法,但它們最終做同樣的事情 - 對于文件中的每個組,獲取所需的數據集。 h5py文檔應該是完整的,沒有隱藏的方法。這visit是遞歸的,類似于用于訪問目錄和文件的 Python OS 功能。
在h5py文件和組中表現得像 Python dicts。它是行為類似于numpy數組的數據集。

TA貢獻1802條經驗 獲得超6個贊
如果您知道您將始終擁有此數據模式,則可以使用鍵(如上一個答案所示)。這意味著只有根級別的組,而數據集是每個組下的唯一對象。當您不知道文件的確切內容時,“訪問者”功能非常方便。
有 2 個訪問者函數。他們是visit()和visititems()。每個遞歸地遍歷對象樹,為每個對象調用訪問者函數。唯一的區別是可調用函數visit接收 1 個值:name,而visititems接收 2 個值:name和node(一個 h5py 對象)。名稱就是一個對象的名稱,而不是完整的路徑名。我更喜歡visititems有兩個原因:1) 擁有節點對象允許您對對象類型進行測試(如下所示),以及 2) 確定路徑名需要您知道路徑或使用對象的名稱屬性來獲取它。
下面的示例創建一個簡單的 HDF5 文件,創建一些組和數據集,然后關閉該文件。然后它以讀取模式重新打開并用于visititems()遍歷文件對象樹。(注意:訪問者函數可以有任何名稱并且可以與任何對象一起使用。它從文件結構中的那個點開始遞歸遍歷。)
f.close()此外,您在使用構造時不需要with / as:。
import h5py
import numpy as np
def visit_func(name, node) :
print ('Full object pathname is:', node.name)
if isinstance(node, h5py.Group) :
print ('Object:', name, 'is a Group\n')
elif isinstance(node, h5py.Dataset) :
print ('Object:', name, 'is a Dataset\n')
else :
print ('Object:', name, 'is an unknown type\n')
arr = np.arange(100).reshape(10,10)
with h5py.File('SO_63315196.h5', 'w') as h5w:
for cnt in range(3):
grp = h5w.create_group('group_'+str(cnt))
grp.create_dataset('data_'+str(cnt),data=arr)
with h5py.File('SO_63315196.h5', 'r') as h5r:
h5r.visititems(visit_func)
添加回答
舉報