如何使用 python 将 Hdf5 文件部分复制到保持相同结构的新文件中?

Posted

技术标签:

【中文标题】如何使用 python 将 Hdf5 文件部分复制到保持相同结构的新文件中?【英文标题】:How to partially copy using python an Hdf5 file into a new one keeping the same structure? 【发布时间】:2014-08-22 00:17:12 【问题描述】:

我有一个大的 hdf5 文件,看起来像这样:

A/B/dataset1, dataset2
A/C/dataset1, dataset2
A/D/dataset1, dataset2
A/E/dataset1, dataset2

...

我想创建一个仅包含以下内容的新文件: A/B/dataset1,dataset2 空调/dataset1,dataset2

python中最简单的方法是什么?

我做到了:

fs = h5py.File('source.h5', 'r')
fd = h5py.File('dest.h5', 'w')
fs.copy('group B', fd)

问题是我得到了 dest.h5:

B/dataset1, dataset2

而且我缺少部分树状结构。

【问题讨论】:

【参考方案1】:

fs.copy('A/B', fd) 不会将路径 /A/B/ 复制到 fd,它只会复制组 B(正如您所发现的!)。所以你首先需要创建路径的其余部分:

fd.create_group('A')
fs.copy('A/B', fd['/A'])

或者,如果您将经常使用该组:

fd_A = fd.create_group('A')
fs.copy('A/B', fd_A)

这会将B 组从fs['/A/B'] 复制到fd['/A']

In [1]: fd['A/B'].keys()
Out[1]: [u'dataset1', u'dataset2']

这是一种自动执行此操作的方法:

# Get the name of the parent for the group we want to copy
group_path = fs['/A/B'].parent.name

# Check that this group exists in the destination file; if it doesn't, create it
# This will create the parents too, if they don't exist
group_id = fd.require_group(group_path)

# Copy fs:/A/B/ to fd:/A/G
fs.copy('/A/B', group_id, name="G")

print(fd['/A/G'].keys())
# [u'dataset1', u'dataset2']

【讨论】:

谢谢,我只是希望您可以做到这一点,而无需手动手动创建更接近根目录的组(我的文件中有更多组,这是一个插图)。跨度> 另外,如何将 B 复制到不同的名称?更一般地说,是否可以重命名单独的组或数据集? 我添加了一种自动执行此操作的方法。您可以将它包装成一个函数,将要复制的 fs 中的组和目标的文件句柄传递给它。您可以使用 move(source,dest) 重命名组和数据集 不用担心。如果这回答了您的问题,您可以投票并接受答案:)

以上是关于如何使用 python 将 Hdf5 文件部分复制到保持相同结构的新文件中?的主要内容,如果未能解决你的问题,请参考以下文章

将 hdf5 文件加载到 python xarrays

如何编辑hdf5文件的一部分

无法使用scipy.io或hdf5storage将mat文件加载到python中

将 HDF5 文件转换为其他格式

使用 Pandas、Python 将数据附加到 HDF5 文件

如何在 Python 中查找 HDF5 文件组/键?