Source code for coilpy.hdf5
import h5py
import os # for path.abspath
import keyword # for getting python keywords
# Modified from J. Schilling (jonathan.schilling@ipp.mpg.de)'s script for SPEC
[docs]class HDF5:
"""Create a python object for a HDF5 file.
Returns:
HDF5 class: python HDF5 object.
Use as s = HDF5(filename), e.g. s=HDF5("ext.h5")
This class can be iterated or entered.
To check all the items, you can use `self.inventory()`.
"""
def __init__(self, *args, **kwargs):
"""Constructor
Args:
arg[0] (str): The name of a file or an item inside the root object.
If args[0] is not a filename, kwargs['content'] should be the
content to be added as self.`args[0]`.
"""
_content = None
if kwargs.get("content") is None:
# assume arg[0] is a filename
_content = h5py.File(args[0], "r")
# keep track of which file this object corresponds to
self.filename = os.path.abspath(args[0])
elif isinstance(kwargs["content"], h5py.Group):
_content = kwargs["content"]
if _content is not None:
for key in _content:
if isinstance(_content[key], h5py.Group):
# recurse into group
setattr(self, key, HDF5(content=_content[key]))
elif isinstance(_content[key], h5py.Dataset): # read dataset
if (
key in keyword.kwlist
): # add underscore avoiding assigning python keywords
setattr(self, key + "_", _content[key][()])
else:
try: # this should be simplified when FOCUS writes the correct format
if len(_content[key][()]) == 1:
# if just one element, use the value directly
setattr(self, key, _content[key][0])
else: # arrays
setattr(self, key, _content[key][()])
except TypeError: # scalar
setattr(self, key, _content[key][()])
if isinstance(_content, h5py.File):
_content.close()
# needed for iterating over the contents of the file
def __iter__(self):
return iter(self.__dict__)
def __next__(self):
return next(self.__dict__)
def __enter__(self):
return self
def __exit__(self, t, v, tb):
return
[docs] def inventory(self, prefix=""):
"""Print a list of items contained in this object
Args:
prefix (str, optional): Header to be printed. Defaults to "".
"""
_prefix = ""
if prefix != "":
_prefix = prefix + "/"
for a in self:
try:
# recurse into member
getattr(self, a).inventory(prefix=_prefix + a)
except AttributeError:
# print item name
print(_prefix + a)