参考:
今天拿到了一个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
2. 配置文件的顺序。根据2.7版本的文档,应该没有这个问题。
python文档
class ConfigParser.RawConfigParser([defaults[, dict_type[, allow_no_value]]])
The basic configuration object. When defaults is given, it is initialized into the dictionary of intrinsic defaults. When dict_type is given, it will be used to create the dictionary objects for the list of sections, for the options within a section, and for the default values. When allow_no_value is true (default: False), options without values are accepted; the value presented for these is None.
...
Changed in version 2.6: dict_type was added.
Changed in version 2.7: The default dict_type is collections.OrderedDict. allow_no_value was added.
OrderedDict应该能保留文件内容的次序。如果你用的2.6, 需要在构造ConfigParser的实例时加上OrderedDict参数。
3. 注释。这个没办法(后面说的办法实在不是好办法),读入的时候注释就被去掉了。
对单独在一行的代码,你可以在读入前把"#", ";"换成其他字符,使用allow_no_value选项,这样注释会被当成配置保存下来,处理后你再把“#”, ";"换回来。
对行内的注释,这样做会影响真正配置的值。
对于第三点,现在可以在构造ConfigParser() 的时候直接把注释用的tag 给修改掉。
我这样做,#开头的行不会被认为是注释,只保留了";".
-
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation(),comment_prefixes=(';'))
但是在同一个section里面,#开头的行里面内容一样就惨了,例如我这个文件里同一section 下面就有很多的
# 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')
如果能用configparser 的话会简单很多。
-
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')
感谢别人一下,这个for 循环使用Flag 变量很不错。
-
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')
阅读(1603) | 评论(0) | 转发(0) |