class TestVisit(TestCase): """ Feature: The .visit and .visititems methods allow iterative access to group and subgroup members """ def setUp(self): self.f = File(self.mktemp(), 'w') self.groups = [ 'grp1', 'grp1/sg1', 'grp1/sg2', 'grp2', 'grp2/sg1', 'grp2/sg1/ssg1' ] for x in self.groups: self.f.create_group(x) def tearDown(self): self.f.close() def test_visit(self): """ All subgroups are visited """ l = [] self.f.visit(l.append) self.assertSameElements(l, self.groups) def test_visititems(self): """ All subgroups and contents are visited """ l = [] comp = [(x, self.f[x]) for x in self.groups] self.f.visititems(lambda x, y: l.append((x, y))) self.assertSameElements(comp, l) def test_bailout(self): """ Returning a non-None value immediately aborts iteration """ x = self.f.visit(lambda x: x) self.assertEqual(x, self.groups[0]) x = self.f.visititems(lambda x, y: (x, y)) self.assertEqual(x, (self.groups[0], self.f[self.groups[0]]))
def test_visit(self): fname = self.mktemp() fid = File(fname, 'w') fid.create_dataset('foo', (100, ), dtype='uint8') with pytest.raises(TestException, match='throwing exception'): fid.visititems(throwing) fid.close()
def get_dataset(h5file: File, path: DatasetPath) -> Dataset: res = None if isinstance(path, DatasetPathContains): res = h5file.visititems(partial(_v_item, path.path)) elif isinstance(path, DatasetPathWithAttribute): res = h5file.visititems(partial(_v_attrs, path.attribute, path.value)) return res
def hdf5_keys(dataset: h5py.File): keys = [] def visitor(key, value): if isinstance(value, h5py.Dataset): keys.append(key) dataset.visititems(visitor) return keys
def find_virtual_datasets(file: h5py.File): """Return a list of 2-tuples: (path in file, dataset)""" res = [] def visit(path, obj): if isinstance(obj, h5py.Dataset) and obj.is_virtual: res.append((path, obj)) file.visititems(visit) return sorted(res)
def axf2dict(axf: h5py.File) -> Dict: megaobject = NestedDict() def itemsvisitor(k, v): print(k, type(v), v) keys = k.split("/") if type(v) is Dataset: d: Dataset = v print(d.shape) if d.shape == (): print(d.dtype, d.value) if str(d.dtype).startswith('|S'): megaobject[keys] = str(d.value) elif d.dtype == np.float32: megaobject[keys] = float(d.value) elif d.dtype == np.int32: megaobject[keys] = int(d.value) elif d.dtype == np.uint8: megaobject[keys] = int(d.value) elif d.dtype == np.uint32: megaobject[keys] = int(d.value) else: megaobject[keys] = d.value elif len(d.shape) == 1: print(d.dtype, type(d[0]), np.array(d)) if isinstance(d[0], bytes): megaobject[keys] = list(map(lambda x: str(x), d)) elif isinstance(d[0], np.float32): megaobject[keys] = list(map(lambda x: float(x), d)) elif isinstance(d[0], np.int32): megaobject[keys] = list(map(lambda x: int(x), d)) else: megaobject[keys] = list(d) json.dumps(megaobject[keys]) else: x = reduce(lambda a, b: a * b, d.shape) if x < 100: ll = np.array(d).tolist() megaobject[keys] = ll else: megaobject[keys] = f'BIG{d.shape}' json.dumps(megaobject[keys]) elif type(v) is Group: print('group') megaobject[keys] = {} else: raise Exception(f"unhandled type {type(v)} {k}") axf.visititems(itemsvisitor) return megaobject.dict
class TestVisit(TestCase): """ Feature: The .visit and .visititems methods allow iterative access to group and subgroup members """ def setUp(self): self.f = File(self.mktemp(), 'w') self.groups = [ 'grp1', 'grp1/sg1', 'grp1/sg2', 'grp2', 'grp2/sg1', 'grp2/sg1/ssg1' ] for x in self.groups: self.f.create_group(x) def tearDown(self): self.f.close() def test_visit(self): """ All subgroups are visited """ l = [] self.f.visit(l.append) self.assertSameElements(l, self.groups) def test_visititems(self): """ All subgroups and contents are visited """ l = [] comp = [(x, self.f[x]) for x in self.groups] self.f.visititems(lambda x, y: l.append((x,y))) self.assertSameElements(comp, l) def test_bailout(self): """ Returning a non-None value immediately aborts iteration """ x = self.f.visit(lambda x: x) self.assertEqual(x, self.groups[0]) x = self.f.visititems(lambda x, y: (x,y)) self.assertEqual(x, (self.groups[0], self.f[self.groups[0]]))