ConfigParser寫配置文件亂序問題
在Centos6.5的環境下,通常使用ConfigParser進行配置文件的解析。Centos6.5的Python版本為Python 2.6.6。
對於一般的應用場景中配置文件的順序沒有那麼的重要,但有些場景中配置文件的順序是非常有效的,特別是當配置項的值具有覆蓋功能時這種問題更加的嚴重。
以下面的例子為例進行說明:
- [b]
- y1 = 10
- x2 = 20
- z1 = 30
- [a]
- x2 = 40
- z2 = 10
- 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']
>>>
具體代碼如下所示
- import ConfigParser
- config = ConfigParser.ConfigParser()
- fp = open(r"/root/test/ceph.conf", "r")
- config.readfp(fp)
- sections = config.sections()
- print sections
通過上述的輸出可知,配置文件的section順序為b, a,而實際輸出的section為a, b。對於一般場景下無所謂,但在包含的場景中,比如b是一個通用的配置,而a是一個特殊的配置,a的配置能夠覆蓋b中某些配置項的內容,此時就會出現問題。出現這種問題的根本原因是在ConfigParser中默認采用了dict保存解析到的數據,而dict本身是無序的,實際上是根據鍵值的順序保存,因此出現了a,b的順序。這樣也就可能導致配置文件的亂序。
實際上根據官方的文檔可知,可以設置ConfigParser的dict_type參數,改變對應的字典類型,從而解決這種序列問題。Changedinversion2.6:dict_typewasadded.
Changedinversion2.7:Thedefaultdict_typeiscollections.OrderedDict.allow_no_valuewasadded.經過測試在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']
>>>
具體代碼如下:
- 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