Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1742552
  • 博文数量: 297
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 3006
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-06 22:04
个人简介

Linuxer, ex IBMer. GNU https://hmchzb19.github.io/

文章分类

全部博文(297)

文章存档

2020年(11)

2019年(15)

2018年(43)

2017年(79)

2016年(79)

2015年(58)

2014年(1)

2013年(8)

2012年(3)

分类: Python/Ruby

2016-05-26 21:04:47

参考:

今天拿到了一个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 给修改掉。
我这样做,#开头的行不会被认为是注释,只保留了";".

点击(此处)折叠或打开

  1. config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation(),comment_prefixes=(';'))
但是在同一个section里面,#开头的行里面内容一样就惨了,例如我这个文件里同一section 下面就有很多的
# Minimum value: 1
# Maximum value: 65535

最后无奈,自己写了个循环,写的很悲剧,因为我是强行拿[keystone_authtoken] 和[libvirt] 之间的字符串做了对比。
代码如下:

点击(此处)折叠或打开

  1. def change_nova_conf2(user,passwd):
  2.     infile=open("nova.conf","r")
  3.     with open("newnova2.conf","w")as outfile:
  4.         lines=infile.readlines()
  5.         for lineno,line in enumerate(lines):
  6.             i=0
  7.             if line.strip()=="[keystone_authtoken]" and i<2:
  8.                 begin=lineno
  9.                 i+=1
  10.             if line.strip()=="[libvirt]" and i < 2:
  11.                 stop=lineno
  12.                 i+=1
  13.         for i in range(begin,stop):
  14.             if lines[i].strip()=="admin_user=nova":
  15.                 lines[i]="admin_user={}\n".format(user)
  16.             if lines[i].strip()=="admin_password=abc1234":
  17.                 lines[i]="admin_password={}\n".format(passwd)
  18.         final="".join(lines)
  19.         outfile.write(final)


  20. change_nova_conf2('admin','admin')
如果能用configparser 的话会简单很多。

点击(此处)折叠或打开

  1. import configparser
  2. def change_nova_conf(user,passwd):
  3.     config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation(),comment_prefixes=(';'))
  4.     config.read('nova.conf')
  5.     #print(config.get('keystone_authtoken','admin_user'))
  6.     #print(config.get('keystone_authtoken','admin_password'))
  7.     config.set('keystone_authtoken','admin_user',user)
  8.     config.set('keystone_authtoken','admin_password',passwd)
  9.     with open("newnova.conf","w") as config_file:
  10.         config.write(config_file,space_around_delimiters=False)

  11. change_nova_conf('admin','admin')
感谢别人一下,这个for 循环使用Flag 变量很不错。



点击(此处)折叠或打开

  1. def change_nova_conf3(user,passwd):
  2.     infile=open("nova.conf","r")
  3.     flag=False
  4.     lines=infile.readlines()
  5.     infile.close()
  6.     for index,line in enumerate(lines):
  7.         line=line.rstrip()
  8.         if line=="[keystone_authtoken]":
  9.             flag=True
  10.         
  11.         elif flag:
  12.             if line=="admin_user=nova":
  13.                 line="admin_user={}\n".format(user)
  14.                 lines[index]=line
  15.                 
  16.             elif line=="admin_password=abc1234":
  17.                 line="admin_password={}\n".format(passwd)
  18.                 lines[index]=line
  19.                 flag=False

  20.     final="".join(lines)
  21.     with open("newnova3.conf","w")as outfile:
  22.         outfile.write(final)

  23. change_nova_conf3('admin','admin')



阅读(1524) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~