在具有任意数量的子项的分层数据(例如文件夹/文件布局)中,表示/读取的最佳数据结构是什么?我见过n元树和尝试,k/d元堆等等。然而,似乎您至少需要知道每个节点在每个结构中拥有的最大子代数量。然而,有没有一种结构可以表示任何分层数据,而不需要知道它在某种程度上是分层的?我不太担心优化性能,因为我不认为我需要处理大量数据(如果它可以优化,那么很好),重要的方面是能够读取一些随机的分层数据并维护所述数据的组织。
#example data
root
- group1
- subgroup1
- child
- child
- data
- subgroup2
- subgroup3
- child
- data
- group2
- subgroup1
- group3
- subgroup1
- child
- data
- subgroup2
- child
- data
- group4
- subgroup1
- subgroup2
- subgroup3
- subgroup4同样,格式可以是任意的,可能有0-500个组,每个组都有一些任意数量的嵌套子对象/路径...
关于上下文,如果需要更多信息:
我希望能够读取任何h5文件的布局,而不必专门为h5文件编写代码,或者严格组织每个具有相同布局的h5文件。这样我就可以创建一个用户可以浏览h5文件的图形用户界面(我正在与不太熟悉编程的科学家一起工作,他们希望尽可能地自动化/拥有图形用户界面)。我已经研究过h5py和pandas,但是通过这些库获取键并不能以一种易于使用的方式来表示文件布局(pandas返回h5文件布局的叶节点,h5py读取每个层次结构级别,并且您需要预先知道键,因此很难遍历和组织文件布局)。到目前为止,我可以解析密钥、组和子组等。从包含这些库的h5文件中删除,但我无法维护路径。使用嵌套的元组似乎太复杂和混乱,这就是为什么我想知道其他更复杂的数据结构。
另外,我需要用Python来做这件事,因为它是我的同事们唯一使用的语言,他们不想学习其他语言(不是出于无知,他们只是不是程序员……)。
发布于 2021-06-04 08:20:27
为了演示我所说的自描述,这里有一个非常简单的示例,它使用.visititems()递归地访问层次结构中的每个HDF5对象。修改以在h5py.File()调用中引用您的文件,您可以看到输出。您将获得2个列表,其中包含可用于填充GUI的组和数据集名称。
注意:如果返回值,.visititems()递归将结束。如果希望在main()例程中遍历模式,则需要创建一个生成器并在执行过程中生成名称。
def get_h5_grps_dsets(name, h5_obj):
if isinstance(h5_obj,h5py.Group):
#print(name,'is a Group')
grp_list.append(name)
elif isinstance(h5_obj,h5py.Dataset):
#print(name,'is a Dataset')
ds_list.append(name)
with h5py.File(file_path, 'r') as h5r:
grp_list = []
ds_list = []
h5r.visititems(get_h5_grps_dsets)
print('\nGroups:')
for grp in grp_list:
print(grp)
print('\nDatasets:')
for ds in ds_list:
print(ds) https://stackoverflow.com/questions/67828225
复制相似问题