Python configObj 能处理没有 '=' 的行吗
我使用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']
示例输出:
['苹果', '橙子']