使用ConfigParser从配置文件获取列表
我在配置文件里有这样的内容(一个配置选项,里面包含了一串字符串的列表):
[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文件来作为配置文件。