Не могу получить доступ к внешней ссылке с помощью python + h5py - PullRequest
2 голосов
/ 06 марта 2019

Недавно я начал работать с .hdf5 файлами и до сих пор не могу понять, как правильно использовать внешние ссылки.

У меня есть несколько .hdf5 файлов.Каждый файл имеет одинаковую структуру, например, одинаковые ключи и типы данных.Я хочу объединить их в один файл, но хранить их отдельно, используя разные ключи для каждого файла.

Вот что я делаю:

myfile = h5py.File("/path_to_the_directory/merged_images.hdf5", 'w')
myfile['0.000'] = h5py.ExternalLink("img_000.hdf5", "/path_to_the_directory/images")
myfile['0.001'] = h5py.ExternalLink("img_001.hdf5", "/path_to_the_directory/images")
myfile.flush()

Затем я пытаюсь прочитать его с помощью:

myfile = h5py.File("/path_to_the_directory/merged_images.hdf5", 'r')
keys = list(myfile.keys())
print(keys)
print(list(myfile[keys[0]]))

Строка print(keys) дает мне ['0.000', '0.001'].Итак, я считаю, что структура файла в порядке.

И следующие строки дают мне исключение: KeyError: "Unable to open object (unable to open external file, external link file name = 'img_000.hdf5')"

Я что-то не так делаю?Документация довольно скудная, и я не нашел там подходящего варианта использования.

1 Ответ

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

Проблема в том, что вы путаете пути. Важно различать два типа путей:

  • Путь к файлу (расположение на жестком диске).
  • Путь к набору данных: этот путь является внутренним для файла HDF5 и не зависит от того, где вы храните файл.

Синтаксис h5py.ExternalLink, как указано в документации , таков:

myfile['/path/of/link'] = h5py.ExternalLink('/path/to/file.hdf5', '/path/to/dataset')

Таким образом, я хотел бы призвать вас использовать относительный путь к файлу для ExternalLink. Если вы это сделаете, то все будет работать, даже если вы переместите коллекцию файлов в другое место на жестком диске (или передадите их кому-то другому).

С правильными путями ваш пример работает, как показано ниже.

Обратите внимание, что для иллюстрации моего замечания об относительных путях к файлам я сделал все пути наборов данных абсолютными (они являются только внутренними по отношению к файлу и не зависят от того, где файл хранится на жестком диске. ) пока я сохранил пути к файлам относительно .

import h5py
import numpy as np

myfile = h5py.File('test_a.hdf5', 'w')
myfile['/path/to/data'] = np.array([0,1,2])
myfile.close()

myfile = h5py.File('test_b.hdf5', 'w')
myfile['/path/to/data'] = np.array([3,4,5])
myfile.close()

myfile = h5py.File('test.hdf5', 'w')
myfile['/a'] = h5py.ExternalLink('test_a.hdf5', '/path/to/data')
myfile['/b'] = h5py.ExternalLink('test_b.hdf5', '/path/to/data')
myfile.close()

myfile = h5py.File('test.hdf5', 'r')
keys = list(myfile.keys())
print(keys)
print(list(myfile[keys[0]]))
print(list(myfile[keys[1]]))
myfile.close()

Отпечатки (как и ожидалось):

['a', 'b']
[0, 1, 2]
[3, 4, 5]
...