Source code for PyMca5.PyMcaIO.ConfigDict

#/*##########################################################################
#
# The PyMca X-Ray Fluorescence Toolkit
#
# Copyright (c) 2004-2014 European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "E. Papillon & V.A. Sole - ESRF Software Group"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import sys
if sys.version < '3.0':
    import ConfigParser
else:
    import configparser as ConfigParser
try:
    import numpy
    USE_NUMPY = True
except ImportError:
    # do not use numpy, use lists
    USE_NUMPY = False


[docs]class ConfigDict(dict): def __init__(self, defaultdict=None, initdict=None, filelist=None): if defaultdict is None: defaultdict = {} dict.__init__(self, defaultdict) self.default = defaultdict self.filelist = [] if initdict is not None: self.update(initdict) if filelist is not None: self.read(filelist)
[docs] def reset(self): """ Revert to default values """ self.clear() self.update(self.default)
[docs] def clear(self): """ Clear dictionnary """ dict.clear(self) self.filelist = []
def _check(self): pass def __tolist(self, mylist): if mylist is None: return None if not isinstance(mylist, list): return [mylist] else: return mylist
[docs] def getfiles(self): return self.filelist
[docs] def getlastfile(self): return self.filelist[len(self.filelist) - 1]
def __convert(self, option): return option
[docs] def read(self, filelist, sections=None): """ read the input filename into the internal dictionary """ filelist = self.__tolist(filelist) sections = self.__tolist(sections) cfg = ConfigParser.ConfigParser() cfg.optionxform = self.__convert cfg.read(filelist) self.__read(cfg, sections) for ffile in filelist: self.filelist.append([ffile, sections]) self._check()
def __read(self, cfg, sections=None): cfgsect = cfg.sections() if sections is None: readsect = cfgsect else: readsect = [sect for sect in cfgsect if sect in sections] for sect in readsect: ddict = self for subsectw in sect.split('.'): subsect = subsectw.replace("_|_", ".") if not (subsect in ddict): ddict[subsect] = {} ddict = ddict[subsect] for opt in cfg.options(sect): ddict[opt] = self.__parse_data(cfg.get(sect, opt)) def __parse_data(self, data): if len(data): if data.find(',') == -1: # it is not a list if USE_NUMPY and (data[0] == '[') and (data[-1] == ']'): # this looks as an array try: return numpy.array([float(x) for x in data[1:-1].split()]) except ValueError: try: if (data[2] == '[') and (data[-3] == ']'): nrows = len(data[3:-3].split('] [')) indata = data[3:-3].replace('] [', ' ') indata = numpy.array([float(x) for x in indata.split()]) indata.shape = nrows, -1 return indata except ValueError: pass dataline = [line for line in data.splitlines()] if len(dataline) == 1: return self.__parse_line(dataline[0]) else: return [self.__parse_line(line) for line in dataline] def __parse_line(self, line): if line.find(',') != -1: if line.endswith(','): if ',' in line[:-1]: return [self.__parse_string(sstr.strip()) for sstr in line[:-1].split(',')] else: return [self.__parse_string(line[:-1].strip())] else: return [self.__parse_string(sstr.strip()) for sstr in line.split(',')] else: return self.__parse_string(line.strip()) def __parse_string(self, sstr): try: return int(sstr) except ValueError: try: return float(sstr) except ValueError: return sstr
[docs] def tostring(self, sections=None): import StringIO tmp = StringIO.StringIO() sections = self.__tolist(sections) self.__write(tmp, self, sections) return tmp.getvalue()
[docs] def write(self, filename, sections=None): """ Write the current dictionary to the given filename """ sections = self.__tolist(sections) fp = open(filename, "w") self.__write(fp, self, sections) fp.close()
def __write(self, fp, ddict, sections=None, secthead=None): dictkey = [] listkey = [] valkey = [] for key in ddict.keys(): if isinstance(ddict[key], list): listkey.append(key) elif hasattr(ddict[key], 'keys'): dictkey.append(key) else: valkey.append(key) for key in valkey: if USE_NUMPY: if isinstance(ddict[key], numpy.ndarray): fp.write('%s =' % key + ' [ ' + ' '.join([str(val) for val in ddict[key]]) + ' ]\n') continue fp.write('%s = %s\n' % (key, ddict[key])) for key in listkey: fp.write('%s = ' % key) llist = [] sep = ', ' for item in ddict[key]: if isinstance(item, list): if len(item) == 1: llist.append('%s,' % item[0]) else: llist.append(', '.join([str(val) for val in item])) sep = '\n\t' else: llist.append(str(item)) fp.write('%s\n' % (sep.join(llist))) if 0: # this optimization method does not pass the tests. # disable it for the time being. if sections is not None: dictkey= [ key for key in dictkey if key in sections ] for key in dictkey: if secthead is None: newsecthead = key.replace(".", "_|_") else: newsecthead = '%s.%s' % (secthead, key.replace(".", "_|_")) #print "newsecthead = ", newsecthead fp.write('\n[%s]\n' % newsecthead) self.__write(fp, ddict[key], key, newsecthead)
[docs]def prtdict(ddict, lvl=0): for key in ddict.keys(): if hasattr(ddict[key], 'keys'): print('\t' * lvl), print('+', key) prtdict(ddict[key], lvl + 1) else: print('\t' * lvl), print('-', key, '=', ddict[key])
[docs]def main(): if len(sys.argv) > 1: config = ConfigDict(filelist=sys.argv[1:]) prtdict(config) else: print("USAGE: %s <filelist>" % sys.argv[0])
if __name__ == '__main__': main()