今天拿到了一个3000多行的nova.conf ,
要求如下
如果碰到 某一行是[keystone_authtoken]
则将其后的某一行的
admin_user=nova
admin_password=abc1234
修改成
admin_user=admin
admin_password=admin.
这个文件有n 个section,例如[libvirt],
但是[] 不嵌套 , 而且其他的section, 例如[libvrit] 后面也会有
admin_user=nova
admin_password=abc1234
我使用的是3.5 版本的python . 发现我已经没有下面前两个问题了。
2.6 的或许还有下面的前两个问题
1. 大小写。不需要定义子类,也可以直接改optionxform的值:
conf_parser = ConfigParser()
conf_parser.optionsxform = str
python文档OrderedDict应该能保留文件内容的次序。如果你用的2.6, 需要在构造ConfigParser的实例时加上OrderedDict参数。
3. 注释。这个没办法(后面说的办法实在不是好办法),读入的时候注释就被去掉了。
对单独在一行的代码,你可以在读入前把"#", ";"换成其他字符,使用allow_no_value选项,这样注释会被当成配置保存下来,处理后你再把“#”, ";"换回来。
对行内的注释,这样做会影响真正配置的值。
对于第三点,现在可以在构造ConfigParser() 的时候直接把注释用的tag 给修改掉。
我这样做,#开头的行不会被认为是注释,只保留了";".
点击(此处)折叠或打开
- config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation(),comment_prefixes=(';'))
# Minimum value: 1
# Maximum value: 65535
最后无奈,自己写了个循环,写的很悲剧,因为我是强行拿[keystone_authtoken] 和[libvirt] 之间的字符串做了对比。
代码如下:
点击(此处)折叠或打开
- def change_nova_conf2(user,passwd):
- infile=open("nova.conf","r")
- with open("newnova2.conf","w")as outfile:
- lines=infile.readlines()
- for lineno,line in enumerate(lines):
- i=0
- if line.strip()=="[keystone_authtoken]" and i<2:
- begin=lineno
- i+=1
- if line.strip()=="[libvirt]" and i < 2:
- stop=lineno
- i+=1
- for i in range(begin,stop):
- if lines[i].strip()=="admin_user=nova":
- lines[i]="admin_user={}\n".format(user)
- if lines[i].strip()=="admin_password=abc1234":
- lines[i]="admin_password={}\n".format(passwd)
- final="".join(lines)
- outfile.write(final)
- change_nova_conf2('admin','admin')
点击(此处)折叠或打开
- import configparser
- def change_nova_conf(user,passwd):
- config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation(),comment_prefixes=(';'))
- config.read('nova.conf')
- #print(config.get('keystone_authtoken','admin_user'))
- #print(config.get('keystone_authtoken','admin_password'))
- config.set('keystone_authtoken','admin_user',user)
- config.set('keystone_authtoken','admin_password',passwd)
- with open("newnova.conf","w") as config_file:
- config.write(config_file,space_around_delimiters=False)
- change_nova_conf('admin','admin')
点击(此处)折叠或打开
- def change_nova_conf3(user,passwd):
- infile=open("nova.conf","r")
- flag=False
- lines=infile.readlines()
- infile.close()
- for index,line in enumerate(lines):
- line=line.rstrip()
- if line=="[keystone_authtoken]":
- flag=True
-
- elif flag:
- if line=="admin_user=nova":
- line="admin_user={}\n".format(user)
- lines[index]=line
-
- elif line=="admin_password=abc1234":
- line="admin_password={}\n".format(passwd)
- lines[index]=line
- flag=False
- final="".join(lines)
- with open("newnova3.conf","w")as outfile:
- outfile.write(final)
- change_nova_conf3('admin','admin')