prjemian / punx

Python Utilities for NeXus HDF5 files
https://prjemian.github.io/punx
5 stars 7 forks source link

fails to parse attribute with dictionary content #131

Closed prjemian closed 2 years ago

prjemian commented 3 years ago

Failed to parse an HDF5 file (from NSLS-II) that has dictionary content stored in an attribute. The dictionary values are array of float. This h5py code can read that structure and build the desired 1-D array:

import h5py
f = h5py.File("file.h5", "r")
d = {int(k): v for k, v in f["/qval_dict"].attrs.items()}                                                      
q = [d[i][0] for i in sorted(d.keys())]                                                                        

Here's the exception trace:

(bluesky_2020_9) prjemian@poof /tmp $ punx tree uid\=c8a1fb1f-1960-49f8-927a-c29fca8aaafa__Res.h5 

!!! WARNING: this program is not ready for distribution.

Traceback (most recent call last):
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/bin/punx", line 10, in <module>
    sys.exit(main())
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/main.py", line 456, in main
    args.func(args)
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/main.py", line 199, in func_tree
    report = mc.report(args.show_attributes)
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/h5tree.py", line 65, in report
    tree_string_list = self._renderGroup(f, txt, indentation = "")
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/h5tree.py", line 116, in _renderGroup
    s += self._renderGroup(value, itemname, indentation+"  ")
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/h5tree.py", line 104, in _renderGroup
    s += self._renderDataset(value, itemname, indentation+"  ")
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/h5tree.py", line 157, in _renderDataset
    s += self._renderAttributes(dset, indentation)
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/punx/h5tree.py", line 124, in _renderAttributes
    for name, value in obj.attrs.items():       # FIXME: for name, value in obj.attrs.iteritems():
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/h5py/_hl/base.py", line 368, in __iter__
    yield (key, self._mapping.get(key))
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/_collections_abc.py", line 660, in get
    return self[key]
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "/home/prjemian/Apps/anaconda/envs/bluesky_2020_9/lib/python3.8/site-packages/h5py/_hl/attrs.py", line 65, in __getitem__
    dtype = readtime_dtype(attr.dtype, [])
  File "h5py/h5a.pyx", line 327, in h5py.h5a.AttrID.dtype.__get__
  File "h5py/h5a.pyx", line 329, in h5py.h5a.AttrID.dtype.__get__
  File "h5py/h5t.pyx", line 460, in h5py.h5t.TypeID.py_dtype
TypeError: No NumPy equivalent for TypeBitfieldID exists