zoukankan      html  css  js  c++  java
  • Python解析配置文件模块:ConfigPhaser

    算是前几周落下的博客补一篇。介绍一下python中如何解析配置文件。配置文件常用的几种格式:xml,json,还有ini。其中ini算是最简单的一种格式,因为小,解析的速度也要比xml和json快(并没有科学的数据支撑,只是我个人想法)。当然,我并不是说xml和json不好,只是有时候只想在文件里写点配置的话,还是ini比较小巧。好了废话不多说,来讲解一下python中处理ini配置文件的类ConfigPhaser。

    一般来讲,一个ini配置文件里,格式是酱婶的:

    [SectionA]   # 方括号里叫做一个section
    a = aa       # 这里的每一行,等号左侧是一个option,右侧是option的value
    b = bb
    c = cc
    
    [SectionB]
    optionint = 1
    optionfloat = 1.1
    optionstring = string

    就这么简单(配置文件是没有注释的,不要乱写,否则读的时候会出错。xml和json也一样)。

    用python读取配置文件的时候,也是非常简单的:

    1 with open(filename, 'r') as fr:
    2     cfg = ConfigParser.ConfigParser()
    3     cfg.readfp(fr)

    这就读好了。下面的工作就是解析cfg。

    1 # 读取所有sections:
    2 secs = cfg.sections()         # ['SectionA', 'SectionB']

    结果得到section的列表。

    1 # 读取某一个section里面的所有options
    2 ops0 = cfg.options(secs[0])      # ['a', 'b', 'c']

    结果得到所有options的列表。

    可是解析配置文件的目的并不是获得option,而是获得option和value的键值对呀!——直接使用items就好了:

    1 ops1 = cfg.items(secs[1])

    猜猜print ops1的时候会获得什么?嗯,是的,你猜错了。并不是一个字典,而是一个列表:

    [('optionint', '1'), ('optionfloat', '1.1'), ('optionstring', 'string')]

    希望把它当做字典来用的话,需要dict(ops1)

    当我只想获得某一个option的值怎么办呢?不想一下子读那么多数据的话,可以用一系列get的方法:

    1 print cfg.getint(secs[1], 'optionint')  # 1
    2 print cfg.getfloat(secs[1], 'optionfloat')  # 1.1
    3 print cfg.get(secs[1], 'optionstring')  # string

    其实在类的内部实现中,getint和getfloat也只是在get上又封装了一层。

    这就是ConfigPhaser模块的简单用法。然而这个模块并不只是能简单的读取配置文件,还可以动态的添加内容哟~酱婶的:

    1 cfg.add_section('SectionC')             # 添加section
    2 cfg.set('SectionC', 'ex', 'example')    # 添加option及value

    或者删除配置:

    1 cfg.remove_option('SectionC', 'ex')
    2 cfg.remove_section('SectionC')

    之后

    1 with open(filename, 'w') as fw:
    2     cfg.write(fw)

    这样就把配置写回到配置文件里去了。要注意的是,读取配置文件和写配置文件最好分别进行,不要一个文件既读又写。首先,cfg读取的时候用read,这就要求文件一定要用r/r+/a的方式读才行,但是r不能写,r+和a只能在结尾追加,这样cfg在用write写文件的时候,就会把原来的配置再写到配置文件里去,而不是覆盖方式。

    大概就酱。so easy吧。不敢说完全弄清楚了这个配置文件类,但是基本用法这些大概就够用了。

    PS:配置文件的名字,可以不用ini做后缀。随便什么都行,你高兴就好。

    2016.03.07更新:有同学反映ConfigPhaser不支持多线程读写。感觉多线程读肯定没问题,至于写,本身写文件就是一件需要很仔细的事,尽量还是不要多线程的好。只是,如果控制好同步,应该也可以的吧。谁有空的时候可以测试一下,我是不太想研究这个了。本来就是一个不愿意踩坑的人,明知是雷区就应该尽量绕过去而不是蹚过去不是吗?

  • 相关阅读:
    hibernate_0100_HelloWorld
    MYSQL子查询的五种形式
    JSF是什么?它与Struts是什么关系?
    nop指令的作用
    htmlparser实现从网页上抓取数据(收集)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the
    FCKeditor 在JSP上的完全安装
    Java遍历文件夹的2种方法
    充电电池和充电时间说明
    吃知了有什么好处
  • 原文地址:https://www.cnblogs.com/anpengapple/p/5095133.html
Copyright © 2011-2022 走看看