Не удается получить наборы данных в PyTables с использованием естественного именования - PullRequest
1 голос
/ 17 марта 2019

Я новичок в PyTables и хочу получить набор данных из HDF5 с использованием естественного именования, но я получаю эту ошибку, используя следующие данные:

f = tables.open_file ("filename.h5", "r")

f.root.group-1.dataset-1.read ()

группа / не имеет дочернего элемента с именем group

и если я попытаюсь:

f.root.group \ -1.dataset \ -1.read ()

группа / не имеет дочернего элемента с именем group

неожиданный символ после символа продолжения строки

Я не могу изменить имена в группах, потому что это большие данные из эксперимента.

1 Ответ

1 голос
/ 19 марта 2019

Нельзя использовать знак минус (дефис) с именами Natural Naming, поскольку это недопустимый символ в качестве имени переменной Python (group-1 и dataset-1 выглядят как операция вычитания!) Смотрите это обсуждение:
why-python-Does-not-allow-дефисы

Если у вас есть группы и наборы данных, которые используют это соглашение об именах, вам придется использовать file.get_node()метод доступа к ним.Вот простой фрагмент кода для демонстрации.Первая часть создает 2 группы и таблицы (наборы данных).# 1 использует _, а # 2 использует - в именах групп и таблиц.Вторая часть обращается к набору данных № 1 с помощью Natural Naming, а к набору данных № 2 - file.get_node()

import tables as tb
import numpy as np

# Create h5 file with 2 groups and datasets:
# '/group_1', 'ds_1' : Natural Naming Supported
# '/group-2', 'ds-2' : Natural Naming NOT Supported
h5f = tb.open_file('SO_55211646.h5', 'w')

h5f.create_group('/', 'group_1')
h5f.create_group('/', 'group-2')

mydtype = np.dtype([('a',float),('b',float),('c',float)])
h5f.create_table('/group_1', 'ds_1', description=mydtype )
h5f.create_table('/group-2', 'ds-2', description=mydtype )

# Close, then Reopen file READ ONLY
h5f.close()

h5f = tb.open_file('SO_55211646.h5', 'r')

testds_1 = h5f.root.group_1.ds_1.read()
print (testds_1.dtype)

# these aren't valid Python statements:
#testds-2 = h5f.root.group-2.ds-2.read()
#print (testds-2.dtype)

testds_2 = h5f.get_node('/group-2','ds-2').read()
print (testds_2.dtype)

h5f.close()
...