如何使用 pytables 或 h5py 将数据集对象复制到不同的 hdf5 文件?

How to copy a dataset object to a different hdf5 file using pytables or h5py?

我选择了特定的 hdf5 数据集并想将它们复制到新的 hdf5 文件中。我可以找到一些关于在两个文件之间复制的教程,但是如果您刚刚创建了一个新文件并且想要将数据集复制到该文件中怎么办?我认为下面的方法会奏效,但事实并非如此。有没有简单的方法可以做到这一点?

>>> dic_oldDataset['old_dataset']
<HDF5 dataset "old_dataset": shape (333217,), type "|V14">

>>> new_file = h5py.File('new_file.h5', 'a')
>>> new_file.create_group('new_group')

>>> new_file['new_group']['new_dataset'] = dic_oldDataset['old_dataset']


RuntimeError: Unable to create link (interfile hard links are not allowed)

回答1(使用h5py):
这将创建一个简单的结构化数组来填充第一个文件中的第一个数据集。 然后使用 my_array.

从该数据集中读取数据并复制到第二个文件
import h5py, numpy as np

arr = np.array([(1,'a'), (2,'b')], 
      dtype=[('foo', int), ('bar', 'S1')]) 
print (arr.dtype)

h5file1 = h5py.File('test1.h5', 'w')
h5file1.create_dataset('/ex_group1/ex_ds1', data=arr)                
print (h5file1)

my_array=h5file1['/ex_group1/ex_ds1']

h5file2 = h5py.File('test2.h5', 'w')
h5file2.create_dataset('/exgroup2/ex_ds2', data=my_array)
print (h5file2)

h5file1.close()
h5file2.close()

答案2(使用pytables):
这遵循与上述 pytables 函数相同的过程。它创建相同的简单结构化数组来填充第一个文件中的第一个数据集。然后使用 my_array.

从该数据集中读取数据并复制到第二个文件
import tables, numpy as np

arr = np.array([(1,'a'), (2,'b')], 
      dtype=[('foo', int), ('bar', 'S1')]) 
print (arr.dtype)
h5file1 = tables.open_file('test1.h5', mode = 'w', title = 'Test file')
my_group = h5file1.create_group('/', 'ex_group1', 'Example Group')
my_table = h5file1.create_table(my_group, 'ex_ds1', None, 'Example dataset', obj=arr)                
print (h5file1)

my_array=my_table.read()

h5file2 = tables.open_file('test2.h5', mode = 'w', title = 'Test file')
h5file2.create_table('/exgroup2', 'ex_ds2', createparents=True, obj=my_array)
print (h5file2)

h5file1.close()
h5file2.close()

答案 3

使用 h5py group class 的 copy 方法。

TL;DR

这适用于组和数据集。 是递归的(可以做深拷贝和浅拷贝)。 具有属性、符号 link 和引用的选项。

with h5py.File('destFile.h5','w') as f_dest:
    with h5py.File('srcFile.h5','r') as f_src:
            f_src.copy(f_src["/path/to/DataSet"],f_dest["/another/path"],"DataSet")

(文件object也是根组。)

HDF5 中的位置

“HDF5 文件被组织为有根文件,directed graph" (source)。 HDF5 组(包括根组)和数据集作为“位置”相互关联(在 C API 中,大多数函数采用 loc_id 来标识组或数据集)。这些位置是图上的节点,路径描述了通过图到节点的弧。 copy 采用源和目标 位置 ,而不是具体的组或数据集,因此它可以应用于两者。源和目标不需要在同一个文件中。

属性

属性存储在与其关联的组或数据集的 header 中。因此,属性也与该“位置”相关联。因此,复制组或数据集将 包括与该“位置”关联的所有属性。但是你可以关闭它。

参考资料

copy 提供引用设置,也称为 object 指针。 Object指针是hdf5中的一种数据类型:H5T_STD_REG_OBJ,类似于整数H5T_STD_I32BEsource),可以存储在属性或数据集中。引用可以指向数据集中的整个 object 或区域。 copy 似乎只包含 object 参考文献。 它是否打破了数据集区域 H5T_STD_REF_DSETREG

符号links

C api 获取的“位置”是一个抽象级别,这解释了为什么 copy 函数适用于单个数据集。再看看这个图,被标记的是边,而不是节点。在引擎盖下,HDF5 objects 是 links 的目标,每个 link(边缘)都有一个名称,objects(节点)没有名称。有两种类型的 links:硬 links 和符号 links。所有 HDF5 objects 必须至少有一个 hard link,hard links 只能在其文件中定位 objects。当创建硬 links 时,引用计数增加 1,符号 links 不影响引用计数。符号 links 可能指向文件(软)中的 objects 或其他文件(外部)中的 objects。 copy 提供扩展软和外部符号 links 的选项。

这解释了错误代码(如下)并提供了复制数据集的替代方法;软 link 可以允许访问另一个文件中的数据集。

RuntimeError: Unable to create link (interfile hard links are not allowed)