Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156902
  • 博文数量: 13
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 871
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-02 10:59
个人简介

Nobody.

文章分类

全部博文(13)

文章存档

2013年(13)

分类: Python/Ruby

2013-06-03 20:18:06

最近借做项目的机会,了解了几个常用的配置文件类型,包括inijsonxml

我所需要的配置文件大概是这样:


  1. id = 6
  2. port = 22
  3. ip = 1.1.1.1
  4. pwd = 123456
  5. ip = 1.1.1.2
  6. pwd = 123456
  7. ip = 2.2.2.1
  8. pwd = 123456

包括属性idport等,以及若干个ippwd对。以下尝试了inijsonxml三种配置文件。

1、  使用ini格式


  1. [common]
  2. id = '5'
  3. port = 22
  4. [node]
  5. ip = 1.1.1.1
  6. pwd = 123456
  7. [node]
  8. ip = 1.1.1.2
  9. pwd = 123456
  10. [node]
  11. ip = 2.2.2.1
  12. pwd = 123456

配置文件格式简洁明了,但是很遗憾,这不是合法的ini格式,pythonConfigParser无法正确处理。


  1. In [12]: import ConfigParser
  2. In [13]: cf = ConfigParser.ConfigParser()
  3. In [14]: cf.read('config.ini')
  4. Out[14]: ['config.ini']
  5. In [15]: cf.sections()
  6. Out[15]: ['common', 'node']
  7. In [16]: cf.options('node')
  8. Out[16]: ['ip', 'pwd']
  9. In [17]: cf.get('node', 'ip')
  10. Out[17]: '2.2.2.1'

1、  使用json格式


  1. [
  2. {"id" : "5"},
  3. {"port" : 22},
  4. {"node" : [
  5. {"ip" : "1.1.1.1", "pwd" : "123456"},
  6. {"ip" : "1.1.1.2", "pwd" : "123456"},
  7. {"ip" : "2.2.2.1", "pwd" : "123456"}
  8. ]}]

这不就是标准的python变量吗?


  1. In [20]: import json
  2. In [21]: v = json.load(file('config.json'))
  3. In [22]: v
  4. Out[22]:
  5. [{u'id': u'5'},
  6. {u'port': 22},
  7. {u'node': [{u'ip': u'1.1.1.1', u'pwd': u'123456'},
  8. {u'ip': u'1.1.1.2', u'pwd': u'123456'},
  9. {u'ip': u'2.2.2.1', u'pwd': u'123456'}]}]

这个虽然能满足需求,但是感觉读取的时候不够灵活。比如我想直接获取id的值,

  1. In [31]: v[0]['id']
  2. Out[31]: u'5'
但是前提是我必须知道配置文件各项的准确顺序。

1、  使用xml格式


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <config>
  3.     <id>5</id>
  4.     <port>22</port>
  5.     <node>
  6.         <ip>1.1.1.1</ip>
  7.         <pwd>123456</pwd>
  8.     </node>
  9.     <node>
  10.         <ip>1.1.1.2</ip>
  11.         <pwd>123456</pwd>
  12.     </node>
  13.     <node>
  14.         <ip>2.2.2.1</ip>
  15.         <pwd>123456</pwd>
  16.     </node>
  17. </config>

可以满足需求,但是比起前两种稍显臃肿。


  1. $ cat config.py
  2. #! /usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. #

  5. import xml.etree.ElementTree as ET

  6. id = None
  7. port = None
  8. ipset = []

  9. def load_config(file):
  10.     root = ET.parse(file).getroot()

  11.     global id, port
  12.     id = root.find('id').text
  13.     port = root.find('port').text

  14.     nodes = root.findall('node')
  15.     for node in nodes:
  16.         d = {}
  17.         d['ip'] = node.find('ip').text
  18.         d['pwd'] = node.find('pwd').text
  19.         ipset.append(d)

  20. if __name__ == '__main__':
  21.     print id
  22.     print port
  23.     print ipset
        load_config('config.xml')
  24.     print id
  25.     print port
  26.     print ipset

  27. $ ./config.py
  28. None
  29. None
  30. []
  31. 5
  32. 22
  33. [{'ip': '1.1.1.1', 'pwd': '123456'}, {'ip': '1.1.1.2', 'pwd': '123456'}, {'ip': '2.2.2.1', 'pwd': '123456'}]

以上是本人自己理解,不知是否有误,如果针对这个问题还有更好的选择,还望大家多多指教!!
阅读(12570) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~