您的位置:首页 > 编程语言 > Python开发

python 解析配置文件

2014-04-22 21:34 399 查看
#!/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来记录,然后加减的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: