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

时间:2018-11-24 06:22:28

标签: python hdf5 h5py pytables

我选择了特定的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)

3 个答案:

答案 0 :(得分:1)

答案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()

答案 1 :(得分:1)

答案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()

答案 2 :(得分:0)

答案 3

使用 copy 中的 group 类的 h5py 方法。

TL;DR

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

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")

(文件对象也是根组。)

HDF5 中的位置

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

HDF5 file structure example

属性

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

参考资料

copy 提供引用设置,也称为对象指针。对象指针是hdf5中的一种数据类型:H5T_STD_REG_OBJ,类似于整数H5T_STD_I32BEsource),可以存储在属性或数据集中。引用可以指向数据集中的整个对象或区域。 copy 似乎只涵盖对象引用。 它是否与数据集区域 H5T_STD_REF_DSETREG 中断?

Object pointer

符号链接

C api 所采用的“位置”是一个抽象级别,这解释了 copy 函数适用于单个数据集的原因。再看图,标记的是边,而不是节点。在幕后,HDF5 对象是链接的目标,每个链接(边)都有一个名称,对象(节点)没有名称。有两种类型的链接:硬链接和符号链接。所有 HDF5 对象必须至少有一个硬链接,硬链接只能针对其文件中的对象。创建硬链接时,引用计数增加 1,符号链接不会影响引用计数。符号链接可以指向文件中的对象(软)或其他文件中的对象(外部)。 copy 提供扩展软链接和外部符号链接的选项。

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

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