如何将这种类型的数据 <hdf5 object reference> 转换为 python 中更易读的东西?

Posted

技术标签:

【中文标题】如何将这种类型的数据 <hdf5 object reference> 转换为 python 中更易读的东西?【英文标题】:How convert this type of data <hdf5 object reference> to something more readable in the python? 【发布时间】:2015-04-16 23:43:48 【问题描述】:

我有相当大的数据集。所有信息存储在 hdf5 格式文件中。我为 python 找到了h5py library。除了

[<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 输出为[&lt;HDF5 object reference&gt;]

test 输出为&lt;HDF5 dataset "path": shape (73583, 1), type "|O8"&gt;

我希望改为 [&lt;HDF5 object reference&gt;] 类似的东西:/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 )

如果没有准确地说明我的问题,我很抱歉。但这是我试图找到的解决方案。

【讨论】:

你能解释一下,这是什么意思吗? @Dims 如果我理解正确,我们遇到的问题是我们有一个&lt;HDF5 object reference&gt;,换句话说,一个引用,而不是对象本身。 “对象”本身就是我们的字符串。 (这就是答案代码中的st)。因此,由于这个引用是对我们读取的文件上的对象(f)的引用,所以我们执行f[st],它返回我们的实际对象(obj)。然后要将这个 HDF5 对象转换为字符串,我们必须对其进行迭代,获取每个整数 i,将其转换为字符(通过执行 chr(i))并将其连接在一起以获得我们的字符串 这个问答类似:***.com/a/12048685/6952495 @RyanQuey 这些问题是兄弟姐妹,真实但不一样(又名重复)。 @DmytroChasovskyi 当然,我同意。并不是说它们是重复的,只是想为那些试图解决另一个问题解决的问题的人标记它们是相似的【参考方案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__,有关详细信息,请参阅Difference between str and repr in 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

【讨论】:

以上是关于如何将这种类型的数据 <hdf5 object reference> 转换为 python 中更易读的东西?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义类型的列表/数组写入 HDF5 文件?

如何将结构转换为hdf5格式并用八度音程保存

将多个数据集读/写到单个 HDF5 文件

通过MATLAB将矩阵数据写入HDF5文件中的每个数据类型成员

编写并将float数组附加到C ++中hdf5文件中的唯一数据集

如何在 C++ 中将 stl::string 写入 HDF5 文件