Как преобразовать этот тип данных «ссылка на объект hdf5» во что-то более читаемое в python?

У меня довольно большой набор данных. Вся информация хранится в файле формата hdf5. Я нашел библиотеку h5py для 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. Если это возможно конечно.


person Dmytro Chasovskyi    schedule 16.02.2015    source источник
comment
Мой вопрос касается не только формата, но и более важного представления данных. Возможно, я не правильно сказал это в своем посте, но, к сожалению, эти ответы не на мой вопрос в действительности.   -  person Dmytro Chasovskyi    schedule 16.02.2015


Ответы (3)


Мой друг ответил на мой вопрос, и я понял, как это было легко. Но я потратил более 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 )

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

person Dmytro Chasovskyi    schedule 16.02.2015
comment
Можете объяснить, что это значит? - person Dims; 18.02.2016
comment
@Dims Если я правильно понимаю, проблема, с которой мы сталкиваемся, заключается в том, что у нас есть <HDF5 object reference>, другими словами, ссылка, а не сам объект. Сам объект является нашей строкой. (Это то, что st в коде в ответе). Следовательно, поскольку эта ссылка является ссылкой на объект в файле, который мы читаем (f), мы делаем f[st], который возвращает наш фактический объект (obj). Затем, чтобы преобразовать этот объект HDF5 в строку, мы должны перебрать его, взять каждое целое число i, преобразовать его в символ (выполнив chr(i)) и соединить их вместе, чтобы получить нашу строку. - person RyanQuey; 06.07.2020
comment
Этот вопрос и ответ похожи: stackoverflow.com/a/12048685/6952495 - person RyanQuey; 06.07.2020
comment
@RyanQuey Вопросы родственные, правда, но разные (они же дубликаты). - person Dmytro Chasovskyi; 07.07.2020
comment
@DmytroChasovskyi определенно, я согласен. Не пытался сказать, что они дублируются, просто хотел пометить их как похожие для тех, кто пытался решить что-то, к чему обращался другой вопрос. - person RyanQuey; 07.07.2020

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

from h5py import File

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

Решение

Получите класс от 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
person Raydel Miranda    schedule 16.02.2015