使用ConfigParser从配置文件获取列表

14 投票
2 回答
39016 浏览
提问于 2025-04-16 21:54

我在配置文件里有这样的内容(一个配置选项,里面包含了一串字符串的列表):

[filters]
filtersToCheck = ['foo', '192.168.1.2', 'barbaz']

有没有更优雅的方法(内置的)来从filtersToCheck中获取一个列表,而不是去掉括号、单引号、空格,然后再用split()来处理?或者说,是否可以用其他模块来实现?

(我用的是python3。)

2 个回答

1
ss = """a_string = 'something'
filtersToCheck = ['foo', '192.168.1.2', 'barbaz']
   a_tuple =      (145,'kolo',45)"""

import re
regx = re.compile('^ *([^= ]+) *= *(.+)',re.MULTILINE)


for mat in regx.finditer(ss):
    x = eval(mat.group(2))
    print 'name :',mat.group(1)
    print 'value:',x
    print 'type :',type(x)
    print

结果

name : a_string
value: something
type : <type 'str'>

name : filtersToCheck
value: ['foo', '192.168.1.2', 'barbaz']
type : <type 'list'>

name : a_tuple
value: (145, 'kolo', 45)
type : <type 'tuple'>

然后

li = [ (mat.group(1),eval(mat.group(2))) for mat in regx.finditer(ss)]
print li

结果

[('a_string', 'something'), ('filtersToCheck', ['foo', '192.168.1.2', 'barbaz']), ('a_tuple', (145, 'kolo', 45))]
27

在配置文件中,你不能直接把Python对象当作列表来用。不过,你可以把它们写成用逗号分隔的值,拿到这些值后再用分割的方法处理。

[filters]
filtersToCheck = foo,192.168.1.2,barbaz

然后你可以这样做:

filtersToCheck = value.split(',')

另一种方法是,创建一个新的类,继承自SafeConfigParser类,去掉方括号,然后构造出列表。你觉得这个方法不好看,但其实这是一个可行的解决方案。

第三种方法是使用Python模块作为配置文件。很多项目都是这么做的。你只需要在config.py模块中把filtersToCheck定义为一个变量,然后直接使用这个列表对象。这是一个比较干净的解决方案。有些人担心用Python文件作为配置文件会有安全隐患(这种担心其实有点没有根据),但也有一部分人认为用户应该编辑配置文件,而不是用Python文件来作为配置文件。

撰写回答