我想将Python中的配置文件完全读入数据结构而不明确地“获取”每个值。这样做的原因是我打算以编程方式修改这些值(例如,我将有一个变量,表示我想将[Foo] Bar = 1
修改为[Foo] Bar = 2
),目的是编写一个基于我的更改的新配置文件。
目前,我正在手工阅读所有数值:
parser = SafeConfigParser()
parser.read(cfgFile)
foo_bar1 = int(parser.get('Foo', 'Bar1'))
foo_bar2 = int(parser.get('Foo', 'Bar2'))
我希望拥有的功能(并没有发现Google的明智之处)是一种将它们读入列表的方法,可以轻松识别它们,以便我可以将该值从列表中删除并进行更改。 / p>
基本上将其引用为(或类似于):
config_values = parser.read(cfgFile)
foo_bar1 = config_values('Foo.bar1')
答案 0 :(得分:3)
对不起,如果我误解了 - 这真的没有你所拥有的那么多 - 似乎一个非常简单的子类可以工作:
class MyParser(SafeConfigParser):
def __call__(self,path,type=int):
return type(self.get(*path.split('.')))
当然,你实际上也不会需要一个子类。您可以将__call__
中的内容放入单独的函数中......
答案 1 :(得分:2)
你在运行python 2.7吗?
有一种很好的方式,我发现几个月前,解析配置文件并使用字典理解设置字典。
config = ConfigParser.ConfigParser()
config.read('config.cfg')
# Create a dictionary of complete config file, {'section':{'option':'values'}, ...}
configDict = {section:{option:config.get(section,option) for option in config.options(section)} for section in config.sections()}
虽然这种方式难以阅读,但它占用的空间更少,而且您不必明确说明您想要获得的每个变量。
- 编辑 -
您仍需要手动更改值的数据类型。
答案 2 :(得分:2)
import sys
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.readfp(sys.stdin)
config = dict((section, dict((option, parser.get(section, option))
for option in parser.options(section)))
for section in parser.sections())
print config
[a]
b = 1
c = 2
[d]
e = 3
{'a': {'c': '2', 'b': '1'}, 'd': {'e': '3'}}