may*_*ull 5 python hdf5 pytables 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)
Run Code Online (Sandbox Code Playgroud)
Har*_*ton 12
使用中的类copy的方法。grouph5py
这适用于组和数据集。是递归的(可以进行深拷贝和浅拷贝)。具有属性、符号链接和引用选项。
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")
Run Code Online (Sandbox Code Playgroud)
(文件对象也是根组。)
“HDF5 文件被组织为有根的有向图”(来源)。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)
Run Code Online (Sandbox Code Playgroud)
答案 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14538 次 |
| 最近记录: |