我已经创建了一个巨大的hdf5数据集,格式如下:
group1/raw
group1/preprocessed
group1/postprocessed
group2/raw
group2/preprocessed
group2/postprocessed
....
group10/raw
group10/preprocessed
group10/postprocessed但是,我意识到为了便于移植,我希望有10个不同的hdf5文件,每个组一个。python中有没有一个函数可以在不遍历所有数据和扫描整个原始hdf5树的情况下实现这一点?
类似于:
import h5py
file_path = 'path/to/data.hdf5'
hf = h5py.File(file_path, 'r')
print(hf.keys())
for group in hf.keys():
# create a new dataset for the group
hf_tmp = h5py.File(group + '.h5', 'w')
# get data from hf[key] and dumb them into the new file
# something like
# hf_tmp = hf[group]
# hf_tmp.dumb()
hf_tmp.close()
hf.close()发布于 2021-06-03 22:56:52
你的想法是对的。上面有几个问题和答案,展示了如何做到这一点。
从这个开始。它展示了如何遍历关键字并确定它是一个组还是一个数据集。:h5py: how to use keys() loop over HDF5 Groups and Datasets
然后看看这些。每种方法都显示了解决问题的略有不同的方法。
这说明了一种方法。Extracting datasets from 1 HDF5 file to multiple files
另外,这是我之前写的一篇文章:How to copy a dataset object to a different hdf5 file using pytables or h5py?
这正好相反(将不同文件中的数据集复制到一个文件中)。它很有用,因为它演示了如何使用.copy()方法:How can I combine multiple .h5 file?
最后,您应该查看visititems()方法以递归搜索所有组和数据集。有关详细信息,请查看以下答案:is there a way to get datasets in all groups at once in h5py?
这应该会回答你的问题。
下面是一些将所有这些想法结合在一起的伪代码。它适用于您的架构,其中所有数据集都位于根级别组中。它不适用于具有多个组级别的数据集的更一般情况。对于更一般的情况,请使用visititems()。
伪代码如下:
with h5py.File(file_path, 'r') as hf:
print(hf.keys())
# loop on group names at root level
for group in hf.keys():
hf_tmp = h5py.File(group + '.h5', 'w')
# loop on datasets names in group
for dset in hf[group].keys():
# copy dataset to the new group file
hf.copy(group+'/'+dset, hf_tmp)
hf_tmp.close()https://stackoverflow.com/questions/67823276
复制相似问题