27

通常,我编写如下代码以获取变量中的特定项目,如下所示

try:
    config = ConfigParser.ConfigParser()
    config.read(self.iniPathName)
except ConfigParser.MissingSectionHeaderError, e:
    raise WrongIniFormatError(`e`)

try:
    self.makeDB = config.get("DB","makeDB")
except ConfigParser.NoOptionError:
    self.makeDB = 0

有没有办法读取python字典中的所有内容?

例如

[一个]
x=1
y=2
z=3
[乙]
x=1
y=2
z=3

被写入

val["A"]["x"] = 1
...
val["B"]["z"] = 3
4

8 回答 8

39

我建议子类化ConfigParser.ConfigParser(或SafeConfigParser,&c)以安全地访问“受保护”属性(以单个下划线开头的名称——“私有”将以两个下划线开头的名称,即使在子类中也不能访问......):

import ConfigParser

class MyParser(ConfigParser.ConfigParser):

    def as_dict(self):
        d = dict(self._sections)
        for k in d:
            d[k] = dict(self._defaults, **d[k])
            d[k].pop('__name__', None)
        return d

这模拟了配置解析器的通常逻辑,并保证在所有有ConfigParser.py模块的 Python 版本中工作(最高 2.7,这是该2.*系列的最后一个 - 知道将来不会有 Python 2.any 版本是如何保证兼容性;-)。

如果您需要支持未来的 Python3.*版本(最高到 3.1 并且可能即将推出的 3.2 应该没问题,只需将模块重命名为全小写configparser而不是当然)它可能需要在几年后进行一些关注/调整,但是我不会期待任何重大的事情。

于 2010-07-10T21:26:01.177 回答
32

我设法得到了答案,但我希望应该有一个更好的答案。

dictionary = {}
for section in config.sections():
    dictionary[section] = {}
    for option in config.options(section):
        dictionary[section][option] = config.get(section, option)
于 2010-07-10T20:31:57.940 回答
16

我知道这个问题是 5 年前提出的,但今天我已经把这个听写理解变成了:

parser = ConfigParser()
parser.read(filename)
confdict = {section: dict(parser.items(section)) for section in parser.sections()}
于 2016-04-11T11:30:15.747 回答
12

ConfigParser 的实例数据在内部存储为嵌套字典。您可以复制它,而不是重新创建它。

>>> import ConfigParser
>>> p = ConfigParser.ConfigParser()
>>> p.read("sample_config.ini")
['sample_config.ini']
>>> p.__dict__
{'_defaults': {}, '_sections': {'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B':         {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}}, '_dict': <type 'dict'>}
>>> d = p.__dict__['_sections'].copy()
>>> d
{'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B': {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}}

编辑:

Alex Martelli 的解决方案更干净、更健壮、更漂亮。虽然这是公认的答案,但我建议改用他的方法。有关更多信息,请参阅他对此解决方案的评论。

于 2010-07-10T21:24:32.257 回答
2

如何在py中解析ini文件?

import ConfigParser
config = ConfigParser.ConfigParser()
config.read('/var/tmp/test.ini')
print config.get('DEFAULT', 'network')

其中 test.ini 文件包含:

[DEFAULT]
network=shutup
others=talk
于 2012-12-09T08:44:55.540 回答
1

要注意的另一件事是ConfigParser将键值转换为小写,因此如果您将配置条目转换为字典,请交叉检查您的要求。因为这个,我遇到了一个问题。对我来说,我有驼峰式键,因此当我开始使用字典而不是文件时,不得不更改一些代码。ConfigParser.get()方法在内部将密钥转换为小写。

于 2016-09-30T12:37:16.700 回答
0

假设文件:config.properties 包含以下内容:

  • k = v
  • k2=v2
  • k3=v3

蟒蛇代码:

def read_config_file(file_path):
        with open(file=file_path, mode='r') as fs:
            return {k.strip(): v.strip() for i in [l for l in fs.readlines() if l.strip() != ''] for k, v in [i.split('=')]}


print('file as dic: ', read_config_file('config.properties'))
于 2019-05-19T04:56:27.550 回答
-1

来自https://wiki.python.org/moin/ConfigParserExamples

def ConfigSectionMap(section):
dict1 = {}
options = Config.options(section)
for option in options:
    try:
        dict1[option] = Config.get(section, option)
        if dict1[option] == -1:
            DebugPrint("skip: %s" % option)
    except:
        print("exception on %s!" % option)
        dict1[option] = None
return dict1
于 2017-02-01T14:34:34.540 回答