程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> ConfigParser寫配置文件亂序問題

ConfigParser寫配置文件亂序問題

編輯:關於PHP編程

ConfigParser寫配置文件亂序問題


在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參數,改變對應的字典類型,從而解決這種序列問題。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']
>>>
具體代碼如下:
  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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved