最近借做项目的机会,了解了几个常用的配置文件类型,包括ini、json、xml。
我所需要的配置文件大概是这样:
- id = 6
- port = 22
- ip = 1.1.1.1
- pwd = 123456
- ip = 1.1.1.2
- pwd = 123456
- ip = 2.2.2.1
- pwd = 123456
包括属性id、port等,以及若干个ip、pwd对。以下尝试了ini、json、xml三种配置文件。
1、 使用ini格式
- [common]
- id = '5'
- port = 22
- [node]
- ip = 1.1.1.1
- pwd = 123456
- [node]
- ip = 1.1.1.2
- pwd = 123456
- [node]
- ip = 2.2.2.1
- pwd = 123456
配置文件格式简洁明了,但是很遗憾,这不是合法的ini格式,python的ConfigParser无法正确处理。
- In [12]: import ConfigParser
- In [13]: cf = ConfigParser.ConfigParser()
- In [14]: cf.read('config.ini')
- Out[14]: ['config.ini']
- In [15]: cf.sections()
- Out[15]: ['common', 'node']
- In [16]: cf.options('node')
- Out[16]: ['ip', 'pwd']
- In [17]: cf.get('node', 'ip')
- Out[17]: '2.2.2.1'
1、 使用json格式
-
[
-
{"id" : "5"},
-
{"port" : 22},
-
{"node" : [
-
{"ip" : "1.1.1.1", "pwd" : "123456"},
-
{"ip" : "1.1.1.2", "pwd" : "123456"},
-
{"ip" : "2.2.2.1", "pwd" : "123456"}
- ]}]
这不就是标准的python变量吗?
- In [20]: import json
- In [21]: v = json.load(file('config.json'))
- In [22]: v
- Out[22]:
- [{u'id': u'5'},
- {u'port': 22},
- {u'node': [{u'ip': u'1.1.1.1', u'pwd': u'123456'},
- {u'ip': u'1.1.1.2', u'pwd': u'123456'},
- {u'ip': u'2.2.2.1', u'pwd': u'123456'}]}]
这个虽然能满足需求,但是感觉读取的时候不够灵活。比如我想直接获取id的值,
- In [31]: v[0]['id']
- Out[31]: u'5'
1、 使用xml格式
-
<?xml version="1.0" encoding="utf-8"?>
-
<config>
-
<id>5</id>
-
<port>22</port>
-
<node>
-
<ip>1.1.1.1</ip>
-
<pwd>123456</pwd>
-
</node>
-
<node>
-
<ip>1.1.1.2</ip>
-
<pwd>123456</pwd>
-
</node>
-
<node>
-
<ip>2.2.2.1</ip>
-
<pwd>123456</pwd>
-
</node>
- </config>
可以满足需求,但是比起前两种稍显臃肿。
-
$ cat config.py
-
#! /usr/bin/env python
-
# -*- coding: utf-8 -*-
-
#
-
-
import xml.etree.ElementTree as ET
-
-
id = None
-
port = None
-
ipset = []
-
-
def load_config(file):
-
root = ET.parse(file).getroot()
-
-
global id, port
-
id = root.find('id').text
-
port = root.find('port').text
-
-
nodes = root.findall('node')
-
for node in nodes:
-
d = {}
-
d['ip'] = node.find('ip').text
-
d['pwd'] = node.find('pwd').text
-
ipset.append(d)
-
-
if __name__ == '__main__':
-
print id
-
print port
-
print ipset
load_config('config.xml')
-
print id
-
print port
-
print ipset
-
-
$ ./config.py
-
None
-
None
-
[]
-
5
-
22
- [{'ip': '1.1.1.1', 'pwd': '123456'}, {'ip': '1.1.1.2', 'pwd': '123456'}, {'ip': '2.2.2.1', 'pwd': '123456'}]
以上是本人自己理解,不知是否有误,如果针对这个问题还有更好的选择,还望大家多多指教!!