Python configObj 能处理没有 '=' 的行吗

2 投票
1 回答
1130 浏览
提问于 2025-04-17 12:44

我使用Python的ConfigObj来加载配置文件,如果配置文件的格式是“cfgName=cfgvalue”,那效果很好。

现在我需要以这种方式编写配置文件:

basket.ini

[favoFruit]
Apple
Orange

我想知道如何通过ConfigObj把这个加载成一个列表,比如 favoFruit['Apple','Orange']

目前我只能在使用 cfgObj=ConfigObj('basket.ini') 时收到错误信息 Invalid line at line "2"

YAML或JSON可以做到这一点,我想问的是ConfigObj也能做到吗?

1 个回答

3

configobj 不支持你想要的那种列表用法,而是需要用逗号分隔的值来表示:

[fruit]
favourite = Apple, Orange

在你的代码中,你只需要像平常一样访问这个属性就可以了:

>>> cfg = configobj.ConfigObj('basket.ini')
>>> cfg['fruit']['favourite']
['Apple', 'Orange']

想了解更多信息,可以看看这篇 文章

补充:如果你真的需要支持和你问题中完全一样格式的配置文件,注意可以很容易地为它写一个自定义的解析器:

import re
from collections import defaultdict

def parse(f):
    data = defaultdict(list)
    section = None
    for line in f:
        line = line.strip()
        if not line:
            continue
        match = re.match('\[(?P<name>.*)\]', line)
        if match:
            section = match.group('name')
        else:
            data[section].append(line)
    return data

cfg = parse(open('basket.ini'))
print cfg['favoFruit']

示例输出:

['苹果', '橙子']

撰写回答