配置文件,包含python中的键值对列表

时间:2008-10-09 11:55:49

标签: python configuration serialization

我有一个python脚本,它分析一组错误消息,并检查每条消息是否与特定模式(正则表达式)匹配,以便对这些消息进行分组。例如,“文件x不存在”和“文件y不存在”将匹配“文件。*不存在”并被视为两次出现的“未找到文件”类别。

随着模式和类别的数量不断增加,我想把这些情侣“正则表达式/显示字符串”放在配置文件中,基本上是某种类型的字典序列化。

我希望这个文件可以手动编辑,所以我放弃了任何形式的二进制序列化,而且我宁愿不采用xml序列化来避免字符转义问题(&<>等等......)。

你知道什么是实现这个目标的好方法吗?

更新:感谢Daren Thomas和Federico Ramponi,但我不能拥有可能任意代码的外部python文件。

6 个答案:

答案 0 :(得分:38)

我有时只会写一个名为config.py的python模块(即文件)或具有以下内容的东西:

config = {
    'name': 'hello',
    'see?': 'world'
}

然后可以像这样“读取”:

from config import config
config['name']
config['see?']

容易。

答案 1 :(得分:35)

你有两个不错的选择:

  1. Python标准配置文件格式 使用ConfigParser
  2. YAML使用PyYAML
  3. 等库

    标准Python配置文件看起来像[sections]key : valuekey = value对的INI文件。这种格式的优点是:

    • 无需第三方图书馆
    • 简单,熟悉的文件格式。

    YAML的不同之处在于它被设计为人性化的数据序列化格式,而不是专门为配置而设计的。它非常易读,并为您提供了几种表示相同数据的方法。对于您的问题,您可以创建一个如下所示的YAML文件:

    file .* does not exist : file not found
    user .* not found : authorization error
    

    或者像这样:

    { file .* does not exist: file not found,
      user .* not found: authorization error }
    

    使用PyYAML并不简单:

    import yaml
    
    errors = yaml.load(open('my.yaml'))
    

    此时errors是一个具有预期格式的Python字典。 YAML能够代表字典以外的代码:如果您更喜欢对的列表,请使用以下格式:

    -
      - file .* does not exist 
      - file not found
    -
      - user .* not found
      - authorization error
    

    或者

    [ [file .* does not exist, file not found],
      [user .* not found, authorization error]]
    

    在调用yaml.load时会生成一个列表列表。

    YAML的一个优点是,您可以使用它将现有的硬编码数据导出到文件中以创建初始版本,而不是剪切/粘贴加上一堆查找/替换以将数据导入到正确的格式。

    YAML格式需要花费更多时间才能熟悉,但使用PyYAML比使用ConfigParser更简单,其优势在于您可以使用YAML获得更多关于数据表示方式的选项。

    任何一个听起来都能满足您当前的需求,ConfigParser将更容易入手,而如果您的需求扩大,YAML将在未来为您提供更多灵活性。

    祝你好运!

答案 2 :(得分:8)

我听说ConfigObj比ConfigParser更容易使用。它被很多大项目使用,IPython,Trac,Turbogears等......

来自introduction

ConfigObj是一个简单但功能强大的配置文件读写器:一个ini文件round tripper。它的主要特点是它非常易于使用,具有简单的程序员界面和简单的配置文件语法。它有很多其他功能:

  • 嵌套部分(子部分),任何级别
  • 列出值
  • 多行值
  • 字符串插值(替换)
  • 集成了强大的验证系统
    • 包括自动类型检查/转换
    • 重复部分
    • 并允许默认值
  • 在写出配置文件时,ConfigObj会保留所有注释以及成员和部分的顺序
  • 使用配置文件的许多有用方法和选项(如'reload'方法)
  • 完全支持Unicode

答案 3 :(得分:4)

我认为你想要标准库中的ConfigParser模块。它读写INI样式文件。我链接到的标准文档中的示例和文档非常全面。

答案 4 :(得分:4)

如果您是唯一可以访问配置文件的人,则可以使用简单的低级解决方案。将“词典”保存在文本文件中作为元组列表(regexp,message),就像它是一个python表达式一样:

[
("file .* does not exist", "file not found"),
("user .* not authorized", "authorization error")
]
在您的代码中,加载它,然后评估它,并在结果中编译正则表达式:
f = open("messages.py")
messages = eval(f.read()) # caution: you must be sure of what's in that file
f.close()
messages = [(re.compile(r), m) for (r,m) in messages]
最后得到一个元组列表(compiled_regexp,message)。

答案 5 :(得分:3)

我通常像达人建议的那样做,只需将配置文件设为Python脚本:

patterns = {
    'file .* does not exist': 'file not found',
    'user .* not found': 'authorization error',
}

然后您可以将其用作:

import config

for pattern in config.patterns:
    if re.search(pattern, log_message):
        print config.patterns[pattern]

顺便说一下,这就是Django对其设置文件的处理方式。