最近借做项目的机会,了解了几个常用的配置文件类型,包括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'}]
以上是本人自己理解,不知是否有误,如果针对这个问题还有更好的选择,还望大家多多指教!!
阅读(797) | 评论(0) | 转发(0) |