首页 > 解决方案 > 如何使用 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循环中执行此操作,对此有什么帮助吗?

标签: hdf5pytablesexternal-links

解决方案


您可以使用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请注意,这是一个非常基本的示例。它不检查节点的对象类型(GroupLeafExternalLink)。它假定根级别的每个节点都是一个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()

推荐阅读