问题:我想将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)
到目前为止还不错。但是如何保存每次迭代中读取的结果呢?
不起作用的解决方案:
在函数末尾添加
return result
会使函数在返回第一个结果后停止,如文档中所述。将附件合并到"visit"中的列表中会出现错误。
results = [] obj.visit(results.append(func(obj,results)) TypeError: 'NoneType' object is not callable
将列表提供给函数并将其附加在其中也不起作用:
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)]