python 解析配置文件


#!/usr/bin/env python
#coding=utf-8  
#上面来显示中文的。不然中文会出问题

'''
说明:输入的文件,#开头的一行默认是注释符号,这一行不计入处理,其余的都是有效行,有效行遇到#也结束
作者:
最后修改时间:2014-04-22
'''
#import pdb
import fileinput
#pdb.set_trace()
def getName(line):
#找到起始位置,因为格式是name = "A",所以找第一个“
start = line.find('"')
if start == -1:
print 'sorry,your file maybe wrong'
return
#找后一个"的位置,不能直接赋值给end,然后end一个一个自加,因为都是引用,start也会跟着end变化
j = 1
while line[start+j] != '"':
j = j + 1
name = line[start+1:start+j]
return name

def getTabName(line):
#首先找到第一个',',然后回找第一个'/',中间的内容就是B.img,然后取B
end = line.find(',')
if end == -1:
print 'sorry,your file maybe wrong'
return
j = 1
while line[end - j] != '/':
#重新给end赋值,即使A.B.C,最后得到的将是A
if(line[end - j] == '.'):
new_end = end - j
j = j + 1
name = line[end-j+1:new_end]
return name

def compare(names):
for i in range(1,len(names)):
if names[i] != names[0]:
return False
return True

#打印列表
def prin(names):
for name in names:
print name

def do_with_line(config_file):
flag = 0
#名字用列表来存储,第一个是name,后面的是tag一次排序的
names = []
for line in fileinput.input(config_file):
#disk 结束
if line.find(']') == 0:
flag = 0
continue
#处理disk下一行
if flag == 1:
names.append(getTabName(line))
continue
#去掉前后的空格
line = line.rstrip()
#如果是#或者'''开头,直接忽略,因为是注释符号
if line[0] == '#':
continue
#查找name,这个必须在首位,不然认为不是name,name只有一个
if line.find('name') == 0:
name = getName(line)
names.insert(0,name)
#找到disk标志
if line.find('disk') == 0:
flag = 1
continue
return names

if __name__ == '__main__':
config_file = 'xen1.cfg'
names = do_with_line(config_file)
prin(names)
if compare(names) == False:
print 'nonono'
else:
print 'yesyesyes'

以上的格式自己调试一下啦。


xen1.cfg内容如下:
#配置文件如下,要求检索主机名A,tap类型磁盘镜像名B,tap2类型磁盘镜像名C
#并且判断A,B,C是否一致
name = "ABC"  #主机名A
uuid = "29a52d04-b30e-8f56-0438-3eb31bbd765f"
maxmem = 3072
memory = 3072
vcpus = 4
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
disk = [
"tap:aio:/home/xen/Bd.img,xvda,w",      #tap类型磁盘镜像/home/xen/B.img,以tap:aio:路径,盘符,打开方式
"tap2:aio:/home/xen/CD23.raw,xvda,w", #tap2类型磁盘镜像/home/xen/C.raw,以tap2:aio:路径,盘符,打开方式
]
vif = [ "mac=00:16:36:30:1c:3e,bridge=xenbr0","mac=00:16:36:30:1c:3f,bridge=xenbr1" ]


根据配置文件,得到name,3个,然后比较3个,如果一样返回True,不一样返回False
得到的结果:



这样必须注意一些问题:
1、py代码如果含有中文,必须有 #coding=utf-8  。
2、一个字符串,要取其中一段,可以用:name = line[start+1:start+j],这样,name就是line从start+1开始到start+j的字符串赋值给name。
3、python布尔,真用的是True,假用的False,只是第一个字母为大写。
4、调试语句,import pdb,开启调试pdb.set_trace()
5、打印一个列表,
for name in names:
print name
6、记住,里面的变量啊,都是引用。所以,你将start = end,然后修改了end,start也跟着修改了。所以我上面的偏移都是用j来记录,然后加减的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值