我选择了特定的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)
答案 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)
使用 copy
中的 group
类的 h5py
方法。
这适用于组和数据集。 是递归的(可以做深拷贝和浅拷贝)。 具有用于属性、符号链接和引用的选项。
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 文件被组织为一个根目录,directed graph”(source)。
HDF5 组(包括根组)和数据集作为“位置”相互关联(在 C API 中,大多数函数采用 loc_id
来标识组或数据集)。这些位置是图上的节点,路径描述了通过图到节点的弧。 copy
采用源和目标位置,而不是专门的组或数据集,因此它可以应用于两者。源和目标不需要在同一个文件中。
属性存储在与其关联的组或数据集的标题中。因此,属性也与该“位置”相关联。因此,复制组或数据集将包括与该“位置”相关联的所有属性。但是,您可以将其关闭。
copy
提供引用设置,也称为对象指针。对象指针是hdf5中的一种数据类型:H5T_STD_REG_OBJ
,类似于整数H5T_STD_I32BE
(source),可以存储在属性或数据集中。引用可以指向数据集中的整个对象或区域。 copy
似乎只涵盖对象引用。 它是否与数据集区域 H5T_STD_REF_DSETREG
中断?
C api 所采用的“位置”是一个抽象级别,这解释了 copy
函数适用于单个数据集的原因。再看图,标记的是边,而不是节点。在幕后,HDF5 对象是链接的目标,每个链接(边)都有一个名称,对象(节点)没有名称。有两种类型的链接:硬链接和符号链接。所有 HDF5 对象必须至少有一个硬链接,硬链接只能针对其文件中的对象。创建硬链接时,引用计数增加 1,符号链接不会影响引用计数。符号链接可以指向文件中的对象(软)或其他文件中的对象(外部)。 copy
提供扩展软链接和外部符号链接的选项。
这解释了错误代码(如下)并提供了复制数据集的替代方法;软链接可以允许访问另一个文件中的数据集。
RuntimeError: Unable to create link (interfile hard links are not allowed)