Как преобразовать этот тип данных <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