configparser中的多维字典

9
使用Python的configparser模块,用缩进方式存储三级多维字典是否可行?这种情况下,解决方法是分割键值对,但想知道是否有更好的直接导入字典的方法。 不能使用sub-option缩进在configparser中
    [OPTIONS]
        [SUB-OPTION]
        option1 = value1
        option2 = value2
        option3 = value3

可行 - 在sub-option值上使用分割方法
    [OPTIONS]
    SUB-OPTION  = 'option1, value1',    
                  'option2, value2',
                  'option3, value3'

字典值
    dict['OPTIONS']['SUB-OPTION'] = {
        option1 : value1,
        option2 : value2,
        option3 : value3,
    }

3个回答

5

据我所知,该格式中存在嵌套的配置文件。

我建议采用类似于 JSON 的配置文件:

{
 "OPTIONS": {
   "SUB-OPTIONS": {
     "option1" : value1,
     "option2" : value2,
     "option3" : value3,
   }
 }
}

然后在代码中使用:

from ast import literal_eval
with open("filename","r") as f:
 config = literal_eval(f.read())

编辑

另外,您可以使用YAML(使用PyYAML)作为一个很好的配置文件。

下面是一个配置文件示例:

option1:
    suboption1:
        value1: hello
        value2: world
    suboption2:
        value1: foo
        value2: bar

可以使用以下方式解析:

import yaml
with open(filepath, 'r') as f:
    conf = yaml.safe_load(f)

然后你可以像在 dict 中一样访问数据:

conf['option1']['suboption1']['value1']
>> 'hello'

谢谢,我试图使用内置的Python configparser创建一个更易读的配置文件,但看起来JSON是唯一的内置解决方案。YAML可能是另一个选择。 - NobleVision
那么我猜最简单的方法就是使用以下格式: [选项,子选项] 选项1=值1 选项2=值2 选项3=值3然后使用 configparse 进行解析,并按逗号拆分每个类别名称,如你所说建立字典。 - Liran Funaro
YAML 也值得一看。 - Liran Funaro
我发现了一个名为ConfigObj的Python包,它具有嵌套部分,但最后一次维护是在2014年。 - NobleVision

2

config.ini

OPTIONS  = {"option1": "value1", "option2": "value2", "option3": "value3"}

代码:

import json
options = json.loads(conf['OPTIONS'])

0

正如其他人指出的那样:当前的configparser实现不支持所请求的嵌套功能。

然而,TOML配置文件遵循与INI文件类似的语法,并允许嵌套结构。请参见官方规范此处和相应的Python库此处

您还可以查看这个SO上的问题,其中包含以下示例:

name = "A Test of the TOML Parser"

[[things]]
a = "thing1"
b = "fdsa"
multiLine = """
Some sample text."""

[[things]]
a = "Something else"
b = "zxcv"
multiLine = """
Multiline string"""
[[things.objs]]
x = 1
[[things.objs]]
x = 4
[[things.objs]]
x = 7
[[things.objs.morethings]]
y = [
    2,
    3,
    4
]
[[things.objs.morethings]]
y = 9

[[things]]
a = "3"
b = "asdf"
multiLine = """
thing 3.
another line"""

JSON 输出:

{
    "name": "A Test of the TOML Parser",
    "things": [{
        "a": "thing1",
        "b": "fdsa",
        "multiLine": "Some sample text."
    }, {
        "a": "Something else",
        "b": "zxcv",
        "multiLine": "Multiline string",
        "objs": [{
            "x": 1
        }, {
            "x": 4
        }, {
            "x": 7,
            "morethings": [{
                "y": [2, 3, 4]
            }, {
                "y": 9
            }]
        }]
    }, {
        "a": "3",
        "b": "asdf",
        "multiLine": "thing 3.\\nanother line"
    }]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接