import ConfigParser
import os
class Parser(object):
"""attributes may need additional manipulation"""
def __init__(self, section):
"""section to retun all options on, formatted as an object
transforms all comma-delimited options to lists
comma-delimited lists with colons are transformed to dicts
dicts will have values expressed as lists, no matter the length
"""
c = ConfigParser.RawConfigParser()
c.read(os.path.join(os.path.dirname(__file__), 'config.cfg'))
self.section_name = section
self.__dict__.update({k:v for k, v in c.items(section)})
#transform all ',' into lists, all ':' into dicts
for key, value in self.__dict__.items():
if value.find(':') > 0:
#dict
vals = value.split(',')
dicts = [{k:v} for k, v in [d.split(':') for d in vals]]
merged = {}
for d in dicts:
for k, v in d.items():
merged.setdefault(k, []).append(v)
self.__dict__[key] = merged
elif value.find(',') > 0:
#list
self.__dict__[key] = value.split(',')
Так что теперь мой config.cfg
файл, который может выглядеть следующим образом:
[server]
credentials=username:admin,password:$3<r3t
loggingdirs=/tmp/logs,~/logs,/var/lib/www/logs
timeoutwait=15
Может быть проанализирован в мелкозернистых-достаточно объектов для моего небольшого проекта.
>>> import config
>>> my_server = config.Parser('server')
>>> my_server.credentials
{'username': ['admin'], 'password', ['$3<r3t']}
>>> my_server.loggingdirs:
['/tmp/logs', '~/logs', '/var/lib/www/logs']
>>> my_server.timeoutwait
'15'
Это очень быстрого разборе простых конфигов, вы потеряете все возможности для извлечения Интса, Bools и других видов продукции либо без преобразования объекта, возвращаемым из Parser
или повторного выполнения работы синтаксического анализа проделанной класс Parser в другом месте.
Так работает файл конфигурации протокола Python. – 2008-12-03 00:02:46
И если у вас есть сложные списки, вы можете обратиться к этому вопросу: http://stackoverflow.com/questions/330900/how-to-quickly-parse-a-list-of-strings :-) – 2008-12-03 01:06:01
приятное решение , но как это сделать, если нет возможного разделителя, чем вы можете гарантировать, не появится внутри элемента списка ??? – wim 2012-02-27 23:23:19