【问题标题】:Getting a list from a config file with ConfigParser使用 ConfigParser 从配置文件中获取列表
【发布时间】:2011-07-20 08:24:53
【问题描述】:

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

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

有没有更优雅(内置)的方式从 filtersToCheck 获取列表,而不是删除括号、单引号、空格,然后使用 split() 来做到这一点?也许是不同的模块?

(使用python3。)

【问题讨论】:

  • 在我看来,这不一样..我知道可以做到,但我正在寻找一种更优雅的方式来做到这一点..此外 - 该链接大约有 3 年的历史,并且从那时起,Python 作为一门语言发生了很多变化。
  • ConfigParser 模块尚未更新以处理此用例,如果这就是您的意思。但是您仍然可以将其子类化以检查字符串中的,split 如果是的话。
  • 完全一样,适用于链接中问题的解决方案也适用于此处。使用 json.loads+configParser 或 ast+configParser 的解决方案基本上是一行并且在一般情况下工作(例如使用字典)。除非你找到他们失败的案例,否则就是这样做的。

标签: python list python-3.x configuration-files configparser


【解决方案1】:

您不能在配置文件的值中像列表一样使用 python 对象。但是你当然可以将它们作为逗号分隔值,一旦你得到它就进行拆分

[filters]
filtersToCheck = foo,192.168.1.2,barbaz

然后做

filtersToCheck = value.split(',')

当然,另一种方法是继承 SafeConfigParser 类并删除 [ 和 ] 并构造列表。您称这为丑陋,但这是一个可行的解决方案。

第三种方式是使用 Python 模块作为配置文件。项目这样做。只需将 filtersToCheck 作为 config.py 模块中可用的变量并使用列表对象。这是一个干净的解决方案。有些人担心将 python 文件用作配置文件(将其称为安全隐患,这在某种程度上是一种毫无根据的恐惧),但也有一些人认为用户应该编辑配置文件而不是用作配置文件的 python 文件。

【讨论】:

  • 在我的情况下没有安全问题。我看到的唯一问题是我需要从我的脚本中制作一个可执行文件(使用 cxfreeze)。我不确定 python 模块(与可执行文件位于同一文件夹中)是否可以在这种情况下工作?我想它可能不会,因为 cxfreeze 也会编译它..
  • cxfreeze 没有任何忽略选项吗?
  • 没想到!它有“--exclude-modules”。我会尝试并报告结果。谢谢你的想法。
【解决方案2】:
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))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多