python与h5结合实例_使用h5py合并所有h5文件
您需要的是文件中所有數據集的列表。我認為這里需要的是recursive function的概念。這將允許您從一個組中提取所有的“數據集”,但是當其中一個看起來是組本身時,遞歸地執行相同的操作,直到找到所有數據集為止。例如:/
|- dataset1
|- group1
|- dataset2
|- dataset3
|- dataset4
偽代碼中的函數應該如下所示:
^{pr2}$
例如:/dataset1是一個數據集:將路徑添加到輸出,給出out = ['/dataset1']
/group不是數據集:調用getdatasets('/group',file)/group/dataset2是一個數據集:將路徑添加到輸出,給出nested_out = ['/group/dataset2']
/group/dataset3是一個數據集:將路徑添加到輸出,給出nested_out = ['/group/dataset2', '/group/dataset3']
這是我們已經擁有的:out = ['/dataset1', '/group/dataset2', '/group/dataset3']
/dataset4是一個數據集:將路徑添加到輸出,給出out = ['/dataset1', '/group/dataset2', '/group/dataset3', '/dataset4']
此列表可用于將所有數據復制到另一個文件中。在
要制作一個簡單的克隆,可以執行以下操作。在import h5py
import numpy as np
# function to return a list of paths to each dataset
def getdatasets(key,archive):
if key[-1] != '/': key += '/'
out = []
for name in archive[key]:
path = key + name
if isinstance(archive[path], h5py.Dataset):
out += [path]
else:
out += getdatasets(path,archive)
return out
# open HDF5-files
data = h5py.File('old.hdf5','r')
new_data = h5py.File('new.hdf5','w')
# read as much datasets as possible from the old HDF5-file
datasets = getdatasets('/',data)
# get the group-names from the lists of datasets
groups = list(set([i[::-1].split('/',1)[1][::-1] for i in datasets]))
groups = [i for i in groups if len(i)>0]
# sort groups based on depth
idx = np.argsort(np.array([len(i.split('/')) for i in groups]))
groups = [groups[i] for i in idx]
# create all groups that contain dataset that will be copied
for group in groups:
new_data.create_group(group)
# copy datasets
for path in datasets:
# - get group name
group = path[::-1].split('/',1)[1][::-1]
# - minimum group name
if len(group) == 0: group = '/'
# - copy data
data.copy(path, new_data[group])
當然,進一步的定制是可能的,這取決于您想要什么。你描述了一些文件的組合。那樣的話你就得new_data = h5py.File('new.hdf5','a')
可能會給這條路加些什么。在
總結
以上是生活随笔為你收集整理的python与h5结合实例_使用h5py合并所有h5文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql初始化脚本建表_mysql新建
- 下一篇: java 正则首位8或者9的8位数字_正