h5py-hdf5将组成员的属性提取到列表中



问题:我想将hdf5文件组的每个成员的属性提取到一个列表中(实际上并不像你所看到的那样,但这与问题无关,所以我保持简单(。

我认为访问功能是最有效的方式。我可以打印结果,但我无法将结果附加到列表中。

这是由"访问"调用的函数:

def func(name,obj):
attribute = obj.attr.get('attribute_group')
if attribute == 2:
result = name
print(result)

这是访问函数,它将函数func应用于组中的所有成员。

file = h5py.File(filepath,'r')
obj = file['/channel_groups/0/clusters/main/']
obj.visit(func)

到目前为止还不错。但是如何保存每次迭代中读取的结果呢?

不起作用的解决方案:

  1. 在函数末尾添加return result会使函数在返回第一个结果后停止,如文档中所述。

  2. 将附件合并到"visit"中的列表中会出现错误。

    results = [] obj.visit(results.append(func(obj,results)) TypeError: 'NoneType' object is not callable

  3. 将列表提供给函数并将其附加在其中也不起作用:

    results = [] obj.visit(func(results)) TypeError: func() missing 1 required positional argument: 'obj'

或者obj.visit(func(obj,results)) TypeError: 'NoneType' object is not callable

这不可能吗?我想避免调用循环中的每个成员,因为这需要时间。

提前感谢

如何在Python中循环HDF5组,根据掩码移除行?

列表是否向右追加(还有[h5py] visit的其他示例(。

visit的参数必须是可调用的,即函数:

results = []
obj.visit(results.append(func(obj,results))
TypeError: 'NoneType' object is not callable

results.append(....)是一个完整的函数调用,python甚至在调用visit之前执行。该列表附加的结果是None(附加已到位(。所以你只是在做

results=[]
results.append(func(obj, results))
obj.visit(None)

我想你需要像这样的东西

def func(name,obj):
attribute = obj.attr.get('attribute_group')
if attribute == 2:
result = name
print(result)
results.append(result)
obj.visit(func)

请记住,您给visit的参数必须是未赋值的函数,而不是某个函数调用的结果。必须是callable


我创建了一个包含一组和两个数据集的文件

In [24]: results = []
In [25]: f.visit(results.append)
In [26]: results
Out[26]: ['agroup', 'agroup/bar', 'agroup/foo']

同时查看名称和引用对象:

In [27]: def func(name):
...:     print(name, f[name])
...:     
In [28]: f.visit(func)
agroup <HDF5 group "/agroup" (2 members)>
agroup/bar <HDF5 dataset "bar": shape (6,), type "<i8">
agroup/foo <HDF5 dataset "foo": shape (3,), type "<i8">

或者具有更复杂的函数:

def func(name):
obj = f[name]
attr = list(obj.attrs.items())
print(name, obj, attr)
x = obj.attrs.get('x',None)
if x:     # not none
results.append((name, x))
In [35]: results=[]
In [36]: f.visit(func)
agroup <HDF5 group "/agroup" (2 members)> []
agroup/bar <HDF5 dataset "bar": shape (6,), type "<i8"> [('x', 10)]
agroup/foo <HDF5 dataset "foo": shape (3,), type "<i8"> [('x', 1)]
In [37]: results
Out[37]: [('agroup/bar', 10), ('agroup/foo', 1)]

再次查看集团文档,我发现有一种visititems方法:

def func(name, obj):
attr = list(obj.attrs.items())
print(name, obj, attr)
x = obj.attrs.get('x',None)
if x:     # not none
results.append((name, x))
In [45]: results=[]
In [46]: f.visititems(func)
agroup <HDF5 group "/agroup" (2 members)> []
agroup/bar <HDF5 dataset "bar": shape (6,), type "<i8"> [('x', 10)]
agroup/foo <HDF5 dataset "foo": shape (3,), type "<i8"> [('x', 1)]
In [47]: results
Out[47]: [('agroup/bar', 10), ('agroup/foo', 1)]

相关内容

  • 没有找到相关文章

最新更新