Skip to content
Snippets Groups Projects
physical_parameter.py 4.19 KiB
Newer Older
import csv
import shelve
import sys
import logging
import argparse
    '''
    This class read a csv file describing physical parameter with ROSCOP codification
    '''

    # constructor with values by default
    def __init__(self, file):
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        # attibutes
        # public:
        self.file = file
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        # private:
        self.__hash = {}
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        # constructor build objet by reading the file
        self.read()
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    # overloading operators
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    def __str__(self):
        ''' overload string representation '''
        return 'Class Roscop, file: %s, size = %d' % (self.file, len(self))
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    def __getitem__(self, key):
        ''' overload r[key]
            for a given key return the values as a dictionary '''
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        if key not in self.__hash:
            logging.error(
                " physicalParametr.py: invalid key: \"{}\"".format(key))
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        else:
            return self.__hash[key]

    def __setitem__(self, key, value):
        ''' overload r[key] = value '''
        if type(value) is not dict:
            logging.error(
                " physicalParametr.py: the value: \"{}\" must be a dictionary".format(value))
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
            return

        if key not in self.__hash:
            self.__hash[key] = value
        else:
            logging.error(
                " physicalParametr.py: modify the existing key: \"{}\" is not allowed".format(key))
jacques Grelet's avatar
jacques Grelet committed

    def __repr__(self):
        ''' overload print() '''
jacques Grelet's avatar
jacques Grelet committed
        return super().__repr__()

    def __len__(self):
        ''' overload len() '''
        return len(self.__hash)

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    # methods public
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    def display_code(self, key):
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
        ''' for a given key print it's name and values as a dictionary '''
        print("%s :" % key)
        print(self[key])

    # read code roscop file
    def read(self):
        with open(self.file, 'rt') as f:

            # Create an object that maps the information in each row to an OrderedDict
            # the values in the first row of file f will be used as the fieldnames.
            reader = csv.DictReader(f, delimiter=';')
            for row in reader:
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
                theKey = row[reader.fieldnames[0]]
                for k in reader.fieldnames:
                    # if the value of key is empty
jacques Grelet's avatar
jacques Grelet committed
                    if row[k] == '' or k == 'key':
                        # remove the key
                        row.pop(k)
                    else:
                        # use the second line with key string to convert each numeric type into float
                        if theKey != 'string':
                            if self['string'][k] == 'numeric':
                                row[k] = float(row[k])
                        logging.debug(
                            " {} -> {}, {} = {}".format(theKey, k, type(row[k]), row[k]))
                self.__hash[theKey] = row

# for testing in standalone context
# ---------------------------------
if __name__ == "__main__":
jacques Grelet's avatar
jacques Grelet committed
    # usage:
    # > python physicalParameter.py code_roscop.csv -k TEMP -d
    parser = argparse.ArgumentParser(
        description='This class Roscop parse a csv file describing physical parameter codification')
    parser.add_argument("-d", "--debug", help="display debug informations",
                        action="store_true")
jacques Grelet's avatar
jacques Grelet committed
    parser.add_argument("-k", "--key", nargs='+',
                        help="display dictionary for key(s), example -k TEMP [PSAL ...]")
    parser.add_argument("file", type=str, help="the csv file to parse")
jacques Grelet's avatar
jacques Grelet committed

    # display extra logging info
    # see: https://stackoverflow.com/questions/14097061/easier-way-to-enable-verbose-logging
    # https://docs.python.org/2/howto/argparse.html
    args = parser.parse_args()
    if args.debug:
        logging.basicConfig(
            format='%(levelname)s:%(message)s', level=logging.DEBUG)

    # Read the csv file and create an instance of Roscop class
    r = Roscop(args.file)
jacques Grelet's avatar
jacques Grelet committed
    # r = Roscop("code_roscop.csv")
    # r.read()
    print(r)

    # get -k arg(s) list
    key = args.key
    # if args list is empty, key contain NoneType
    if key is not None:
        for k in key:
    print("{}: {}".format(key[0], r[key[0]]['long_name']))
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    r['TOTO'] = {'uncle': 'tata'}
    print(r['TOTO'])
    r['TEMP'] = 'tata'