Search code examples
pythonconfigobj

Make python configobj to not put a space before and after the '='


Simple question. It is possible to make configobj to not put a space before and after the '=' in a configuration entry ?

I'm using configobj to read and write a file that is later processed by a bash script, so putting an antry like:

VARIABLE = "value"

breaks the bash script, it needs to always be:

VARIABLE="value"

Or if someone has another suggestion about how to read and write a file with this kind of entries (and restrictions) is fine too.

Thanks


Solution

  • Well, as suggested, I ended up writing my own parser for this that can be used exactly in the same way as ConfigObj:

    config = MyConfigParser("configuration_file")
    print config["CONFIG_OPTION_1"]  
    config["CONFIG_OPTION_1"]= "Value 1"
    print config["CONFIG_OPTION_1
    config.write()
    

    This is the code if someone is interested or wants to give suggestions (I started coding in python not so long ago so probably there are lots of room for improvement). It respects the comments and the order of the options in the file, and correctly scapes and adds double quotes where needed:

    import os
    import sys
    
    class MyConfigParser:
      name = 'MyConfigParser'
      debug = False
      fileName = None
      fileContents = None
      configOptions = dict()  
    
      def __init__(self, fileName, debug=False):
        self.fileName = fileName
        self.debug = debug    
        self._open()
    
      def _open(self):       
        try:
            with open(self.fileName, 'r') as file:
        for line in file:
          #If it isn't a comment get the variable and value and put it on a dict
          if not line.startswith("#") and len(line) > 1:
        (key, val) = line.rstrip('\n').split('=')
        val = val.strip()
        val = val.strip('\"')
        val = val.strip('\'')
        self.configOptions[key.strip()] = val
    except:
      print "ERROR: File "  + self.fileName + " Not Found\n"
    
      def write(self):
    try:
      #Write the file contents
      with open(self.fileName, 'r+') as file:
        lines = file.readlines()
        #Truncate file so we don't need to close it and open it again 
        #for writing
        file.seek(0)
        file.truncate()      
    
        i = 0
        #Loop through the file to change with new values in dict      
        for line in lines:    
          if not line.startswith("#") and len(line) > 1:
        (key, val) = line.rstrip('\n').split('=')
        try:
          if key in line:
            newVal = self.configOptions[key]
            #Only update if the variable value has changed
            if val != newVal:
              newLine = key + "=\"" + newVal + "\"\n"
              line = newLine
        except:
          continue
          i +=1
          file.write(line)
    except IOError as e:
      print "ERROR opening file " + self.fileName + ": " + e.strerror + "\n"
    
    
      #Redefinition of __getitem__ and __setitem__
    
      def __getitem__(self, key):  
    try:
      return self.configOptions.__getitem__(key)
    except KeyError as e:
      if isinstance(key,int):
        keys = self.configOptions.keys()
        return self.configOptions[keys[key]]
      else:
        raise KeyError("Key " +key+ " doesn't exist")
    
      def __setitem__(self,key,value):
    self.configOptions[key] = value