Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1896336
  • 博文数量: 152
  • 博客积分: 3730
  • 博客等级: 上尉
  • 技术积分: 3710
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-02 14:36
个人简介

减肥,运动,学习,进步...

文章分类

全部博文(152)

文章存档

2016年(14)

2015年(17)

2014年(16)

2013年(4)

2012年(66)

2011年(35)

分类: 服务器与存储

2016-03-10 15:21:53

在Centos6.5的环境下,通常使用ConfigParser进行配置文件的解析。Centos6.5的Python版本为Python 2.6.6。

对于一般的应用场景中配置文件的顺序没有那么的重要,但有些场景中配置文件的顺序是非常有效的,特别是当配置项的值具有覆盖功能时这种问题更加的严重。

以下面的例子为例进行说明:

点击(此处)折叠或打开

  1. [b]
  2. y1 = 10
  3. x2 = 20
  4. z1 = 30
  5. [a]
  6. x2 = 40
  7. z2 = 10
  8. y1 = 10
在Centos 6.5常用的配置文件解析方法如下:
[root@stcell03 test]# python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ConfigParser
>>> config = ConfigParser.ConfigParser()
>>> fp = open(r"/root/test/test.conf", "r")
>>> config.readfp(fp)
>>> sections = config.sections()
>>> print sections
['a', 'b']
>>> 
具体代码如下所示

点击(此处)折叠或打开

  1. import ConfigParser
  2. config = ConfigParser.ConfigParser()
  3. fp = open(r"/root/test/ceph.conf", "r")
  4. config.readfp(fp)
  5. sections = config.sections()
  6. print sections
通过上述的输出可知,配置文件的section顺序为b, a,而实际输出的section为a, b。对于一般场景下无所谓,但在包含的场景中,比如b是一个通用的配置,而a是一个特殊的配置,a的配置能够覆盖b中某些配置项的内容,此时就会出现问题。出现这种问题的根本原因是在ConfigParser中默认采用了dict保存解析到的数据,而dict本身是无序的,实际上是根据键值的顺序保存,因此出现了a,b的顺序。这样也就可能导致配置文件的乱序。

实际上根据官方的文档可知,可以设置ConfigParser的dict_type参数,改变对应的字典类型,从而解决这种序列问题。
Changed in version 2.6: dict_type was added.
Changed in version 2.7: The default dict_type is collections.OrderedDict. allow_no_value was added. 
经过测试在Python 2.7的版本中,配置文件不会出现乱序问题,因此可以在Python 2.6的版本中传递2.7的参数。如下所示:
[root@stcell03 test]# python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ConfigParser
>>> from collections import OrderedDict
>>> config = ConfigParser.ConfigParser(dict_type=OrderedDict)
>>> fp = open(r"/root/test/test.conf", "r")
>>> config.readfp(fp)
>>> sections = config.sections()
>>> print sections
['b', 'a']
>>> 
具体代码如下:

点击(此处)折叠或打开

  1. import ConfigParser
  2. from collections import OrderedDict
  3. config = ConfigParser.ConfigParser(dict_type=OrderedDict)
  4. fp = open(r"/root/test/test.conf", "r")
  5. config.readfp(fp)
  6. sections = config.sections()
  7. print sections


阅读(19550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~