Как преобразовать этот тип данных <hdf5 object reference> в нечто более читаемое в python?

У меня довольно большой набор данных. Вся информация хранится в файле формата hdf5. Я нашел h5py library для python. Все работает правильно, кроме

[<HDF5 object reference>]

Я не знаю, как преобразовать его в нечто более читаемое. Могу я вообще это сделать? Потому что документация в этом вопросе немного сложна для меня. Возможно, есть и другие решения с разными языками не только Python. Я ценю каждую помощь, которую я получу.

В идеале он должен быть ссылкой на файл.

Это часть моего кода:

import numpy as np
import h5py 
import time

f = h5py.File('myfile1.mat','r') 
#print f.keys()
test = f['db/path']
st = test[3]
print(  st )

st вывод [<HDF5 object reference>]

test вывод <HDF5 dataset "path": shape (73583, 1), type "|O8">

И я ожидаю вместо [<HDF5 object reference>] что-то вроде этого: /home/directory/file1.jpg. Если это возможно, конечно.

Ответ 1

Мой друг ответил на мой вопрос, и я поняла, как это легко. Но я потратил более 4 часов на решение своей маленькой проблемы. Решение:

import numpy as np
import h5py 
import time

f = h5py.File('myfile1.mat','r') 
test = f['db/path']
st = test[0][0]
obj = f[st]
str1 = ''.join(chr(i) for i in obj[:])
print( str1 )

Извините, если не уточнил мою проблему точно. Но это решение я пытался найти.

Ответ 2

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

from h5py import File

class MyHDF5File (File):
    def __repr__ (self):
        return '<HDF5File({0})>'.format(self.filename)

Ответ 3

Решение

Вывести класс из HDF5 и перезаписать метод __repr__.

Описание

Когда вы печатаете объект, интерпретатор дает вам вызов функции __repr__ на том объекте, который по умолчанию возвращает имя класса и расположение памяти экземпляра.

class Person: 
    def __init__(self, name):
        self.name = name

p = Person("Jhon Doe")
print(p)

>>> <__main__.Person object at 0x00000000022CE940>

В вашем случае у вас есть список только с одним экземпляром объекта HDF5. Эквивалентом будет:

print([p])
>>> [<__main__.Person object at 0x000000000236E940>]

Теперь вы можете изменить способ отображения объектов, перезаполнив функцию __repr__ такого класса.

Примечание. Вы также можете перезаписать __str__, см. Разницу между str и repr в Python для более подробной информации.

class MyReadablePerson(Person):
    def __init__(self, name):
        super(MyReadablePerson, self).__init__(name)
    def __repr__(self):
        return "A person whose name is: {0}".format(self.name)

p1 = MyReadablePerson("Jhon Doe")
print(p1)

>>> A person whos name is: Jhon Doe