结合模板和`ConfigParser`

时间:2015-10-29 21:57:41

标签: python templates

我有一个名为foo.cfg的模板文件:

[Box]
box.active={box_activate}
resolution_tracker.active=true
box.api_key={box_api_key}
box.api_secret={box_api_secret}
box.job_interval=480
box.max_attempts=6
box.users={cs_user}

[Google]
google.active={google_active}
google.job_interval=480
google.users={cs_user}
google.key_file_name={google_p12_file}
google.service_account_id={google_service_account_id}

和我保存这些值的字典:

import ConfigParser

keys = {
    'box_activate': 'false',
    'box_api_key': '',
    'box_api_secret': '',
    'google_active': 'true',
    'google_p12_file': 'GOOGLE_P12_FILE',
    'google_service_account_id': 'GOOGLE_SERVICE_ACCOUNT_ID',
    'cs_user': 'me',
}

parser = ConfigParser.ConfigParser()
parser.read('foo.cfg')
sections = parser.sections()
for section in sections:
  options = parser.options(section)
  for option in options:
    try:
      table[option] = parser.get(section, option)
      if table[option] == -1:
        self.log.info("Skip: %s" % option)
    except:
        self.log.exception("Exception on %s!" % option)
        table[option] = None

with open('foo.properties', 'w') as configfile:
    parser.write(configfile)

我使用ConfigParser来解析foo.cfg,然后将其重写为foo.properties文件。不过,我希望能够将{}之间的所有值替换为keys中的实际值。这样我就可以动态生成properties个文件。我还有一个名为dict的{​​{1}},它是在解析table文件后获得的。我考虑过使用foo.cfg strings,但我相信一定要轻松做到这一点。有什么建议?

1 个答案:

答案 0 :(得分:2)

您可以格式化密钥并使用StringIO创建类似文件的对象,以传递给ConfigParser的readfp方法:

from StringIO import StringIO
# ...

with open('foo.cfg') as foo:
    fixed = foo.read().format(**keys)
parser = ConfigParser.ConfigParser()
parser.readfp(StringIO(fixed))

# ...