Skip to content

Python resources with properties file, update

December 11, 2009

The code I introduced in this post a few days ago has been evolving.  Below is the latest version.  Additions include searching multiple paths for the properties file, explicit naming of properties and minimal exception handling.  If you find this useful, please drop me a line in the comments.

#  $Date: 2009-12-07 19:11:09 -0700 (Mon, 07 Dec 2009) $
#  $Author: scott.hendrickson<at>buildingsi<dot>com $
#
##############################################
# Default resource files are named after class:
# class_name.properties
#
# If this class is the base class, then properties
# file is required.

import os, sys
import logging

class res:
    def __init__(self, logger=None,
                 resourceName=None):
        self.resourceValidFlag = False
        self.logger = logger
        self.resourceMap = {}
        # current path, path of script
        searchPaths = [os.getenv('PWD'),
                       sys.path[0]]
        if resourceName is None:
            filename = ''.join([self.__class__.__name__,
                                ".properties"])
        else:
            filename = ''.join([resourceName,
                                ".properties"])
        propFile = None
        for path in searchPaths:
            tmp = os.path.normpath(''.join([path,
                                            '/',
                                            filename]))
            if os.path.exists(tmp):
                propFile = tmp
        if propFile is not None:
            if self.logger is not None:
                self.logger.info("opening properties file %s" %
                                 filename)
            try:
                f = open(propFile, 'rb')
                for prop in f:
                    if prop[0] <> "#" and prop[0] <> '\n':
                        list = prop.split("=")
                        value = ''
                        for i in range(1,len(list)):
                            value += list[i] + "="
                        key = list[0]
                        value = value[:-1]
                        self.resourceMap[key] = value.strip("\n\r '\"").strip('\n\r')
                        if self.logger is not None:
                            self.logger.debug("property %s set to '%s'" %
                                              (key,
                                               self.resourceMap[key]))
                self.resourceValidFlag = True
            except IOError:
                if self.logger is not None:
                    self.logger.info("unable to read resource file %s" %
                                     propFile)
                else:
                    sys.stderr.write("unable to read resource file %s\n" %
                                     propFile)
        else:
            if self.logger is not None:
                self.logger.info("unable to find resource file %s in %s" %
                                 (filename,
                                  str(searchPaths)))
            else:
                sys.stderr.write("unable to find resource file %s in %s" %
                                 (filename,
                                  str(searchPaths)))

    def isValid(self):
        return self.resourceValidFlag

    def getString(self, key):
        if key in self.resourceMap:
            return self.resourceMap[key]
        else:
            if self.logger is not None:
                self.logger.error("resource %s missing" %
                                  key )
            else:
                sys.stderr.write("resource %s missing\n" %
                                 key )
        return None
Advertisements
No comments yet

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: