3

我想将 Python 中的配置文件完全读入数据结构中,而无需显式“获取”每个值。这样做的原因是我打算以编程方式修改这些值(例如,我将有一个变量表示我想修改[Foo] Bar = 1为 be [Foo] Bar = 2),目的是根据我的更改编写一个新的配置文件。

目前,我正在手动读取所有值:

parser = SafeConfigParser()
parser.read(cfgFile)
foo_bar1 = int(parser.get('Foo', 'Bar1'))
foo_bar2 = int(parser.get('Foo', 'Bar2'))

我希望拥有的(在 Google 方面没有发现太多)是一种将它们读入列表的方法,可以轻松识别它们,以便我可以将该值从列表中拉出并进行更改。

本质上将其称为(或类似):

config_values = parser.read(cfgFile)
foo_bar1      = config_values('Foo.bar1')
4

3 回答 3

3

对不起,如果我误解了——这看起来与你所拥有的并没有太大的不同——似乎一个非常简单的子类可以工作:

class MyParser(SafeConfigParser):
    def __call__(self,path,type=int):
        return type(self.get(*path.split('.')))

当然,您实际上也不需要子类。你可以把这些东西__call__放到一个单独的函数中......

于 2012-11-09T14:35:55.563 回答
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()}

尽管这种方式更难阅读,但它占用的空间更少,而且您不必显式声明您想要获取的每个变量。

  • 注意:这不适用于 python 2.6(*我知道)。我过去曾在使用它的地方编写过脚本,并且由于我在 Windows 上运行 2.7,因此在运行 2.6 的 linux 机器上的某些人会在字典理解上崩溃。

- 编辑 -

您仍需要手动更改值的数据类型。

于 2012-11-09T15:02:24.553 回答
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'}}
于 2012-11-09T16:22:15.413 回答