Есть ли способ получить родителя набора данных или группы при использовании Group.visititems? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь поместить объект File h5py в древовидную структуру, чтобы я мог использовать его способность распечатывать представление дерева для отображения содержимого файла так же, как рекурсивно отображает команда linux "tree"содержимое каталога.Лучший способ рекурсивного посещения всех элементов в файле - это метод Group.visititems и передача функции, которую я буду использовать для добавления узлов в дерево.Вот что у меня пока так:

import h5py
import argparse
import sys
from anytree import Node, RenderTree

class HDFTree:
    def __init__(self,filename):
        self._file = h5py.File(filename,'r')
        self._root = Node(filename)
        self._node_map = {filename:self._root}
        self._create_tree()

    def _add_node(self,name,item):
        #TODO: Figure out way to get parent of fnode
        parent_node = self._node_map[item.parent] # I don't think item.parent is a thing so this wont work
        self._node_map[name] = Node(name,parent=parent_node)

    def _create_tree(self):
        self._file.visititems(self._add_node)

    def print_tree(self):
        print(RenderTree(self._root))

    def __del__(self):
        self._file.close()

1 Ответ

0 голосов
/ 05 марта 2019

После осознания того, что оба класса Dataset и Group действительно имеют родительский атрибут (также отмеченный hpaulj в комментарии к вопросу) и некоторую очистку данных, я смог получить вывод, который мне нужен:

import h5py
import os
from anytree import Node, RenderTree

class HDFTree:
    def __init__(self,filepath):
        self._file = h5py.File(filepath,'r')
        _,filename = os.path.split(filepath)
        root_name,_ = os.path.splitext(filename)
        self._root = Node(root_name)
        self._node_map = {'':self._root}
        self._create_tree()

    def _add_node(self,name,item):
        _,parent_name = os.path.split(item.parent.name)
        parent_node = self._node_map[parent_name]
        _,child_name = os.path.split(name)
        self._node_map[child_name] = Node(child_name,parent=parent_node)

    def _create_tree(self):
        self._file.visititems(self._add_node)

    def print_tree(self):
        print(RenderTree(self._root))

    def __del__(self):
        self._file.close()

Атрибут name классов Dataset и Group, по-видимому, дает полный путь hdf5, поэтому я очистил его с помощью некоторых функций os.path.

...