hdf5 - 如何使用 pytables 取消引用外部链接列表?
问题描述
我使用 pytables 创建了从一个 hdf5 文件到另一个文件的外部链接。我的问题是如何在循环中取消引用它?
例如:
让我们假设file_name = "collection.h5"
,外部链接存储在哪里
我在根节点下创建了外部链接,当我遍历根节点下的节点时,我得到以下输出:
/link1 (ExternalLink) -> /files/data1.h5:/weights/Image
/link2 (ExternalLink) -> /files/data2.h5:/weights/Image
等等,
我知道要取消引用链接,可以这样做,使用以下方式使用自然命名:
f = open_file('collection.h5',mode='r')
plink1 = f.root.link1()
plink2 = f.root.link2()
但我想在for循环中执行此操作,对此有什么帮助吗?
解决方案
您可以使用iter_nodes()
或walk_nodes()
; walk_nodes
是递归的,iter_nodes
不是。iter_nodes()
我对这个 SO 主题的回答中解释了
一个示例: cannot-retrieve-datasets-in-pytables-using-natural-naming
我发现你不能get_node()
用来引用 ExternalLink。您需要以不同的方式引用。
这是一个简单的示例,它collection.h5
从我的本地文件夹中的 HDF5 文件列表创建,然后循环使用iter_nodes()
。for
请注意,这是一个非常基本的示例。它不检查节点的对象类型(Group或Leaf或ExternalLink)。它假定根级别的每个节点都是一个ExternalLink,并从该节点创建一个文件对象。还有其他 PyTables 方法和属性来检查这些情况。有关更强大(复杂)的方法,请参见下面的详细答案。
import tables as tb
import glob
h5f = tb.open_file('collection.h5',mode='w')
link_cnt = 0
for h5name in glob.glob('./SO*.h5'):
link_cnt += 1
h5f.create_external_link('/', 'link'+str(link_cnt), h5name+':/')
h5f.close()
h5f = tb.open_file('collection.h5',mode='r')
for link_node in h5f.iter_nodes('/') :
print("``%s`` is an external link to: ``%s``" % (link_node, link_node.target))
plink = link_node(mode='r') # returns a FILE object
h5f.close()