免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2846 | 回复: 7
打印 上一主题 下一主题

对文件做编辑 [复制链接]

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-26 16:53 |只看该作者 |倒序浏览
本帖最后由 hmchzb19 于 2016-05-26 20:20 编辑

我有个.ini 文件,但是不能用configparser 来parse

要求是
如果碰到 某一行是[keystone_authtoken]
则将其后的某一行的
admin_user=nova
admin_password=abc1234

修改成
admin_user=admin
admin_password=admin.

这个文件有n 个[.$],例如[libvirt],
但是[] 不嵌套,其他的[libvrit] 后面也会有
admin_user=nova
admin_password=abc1234

请问这个要怎么写这个循环?

我大体上写了下
  1. def change_nova_conf(user,passwd):
  2.     infile=open("nova.conf","r")
  3.     with open("newnova2.conf","w")as outfile:
  4.         lines=infile.readlines()
  5.         for line in lines:
  6.             i=0
  7.             if line.strip()=="[keystone_authtoken]" and i< 2:
  8.                 if line.strip()=="admin_user=nova":
  9.                     line="admin_user={}".format(user)
  10.                     i+=1
  11.                 if line.strip()=="admin_password=abc1234":
  12.                     line="admin_password={}".format(passwd)
  13.                     i+=1
  14.         final="".join(lines)
  15.         outfile.write(final)
复制代码
但是这个代码是错的,因为我生成的新的文件内容跟旧文件是一样的

论坛徽章:
0
2 [报告]
发表于 2016-05-26 17:22 |只看该作者
回复 1# hmchzb19

    infile=open("nova.conf","r")
    with open("newnova2.conf","w")as outfile:
        lines=infile.readlines()
        for i,line in enumerate(lines):
            if line.strip()=="admin_user=nova":
                lines="admin_user=admin"
        print "\n".join(lines),

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
3 [报告]
发表于 2016-05-26 17:53 |只看该作者
这样不对,enumerate 的变量i 做什么用。
应该是见到[keystone_authtoken]
则对其后的
admin_user=nova
替换为
admin_user=admin

admin_password=abc1234
替换为
admin_password=admin

而其他的[libvirt] 下面的
admin_user=nova 保持不变

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
4 [报告]
发表于 2016-05-26 21:32 |只看该作者
本帖最后由 mswsg 于 2016-05-26 21:39 编辑

LS表达不是很清楚,细细读了好多次,好像是
  1. 如果碰到 某一行是[keystone_authtoken]
  2. 则将[color=Red]紧跟[/color]其后的
  3. admin_user=nova
  4. admin_password=abc1234
  5. 修改成
  6. admin_user=admin
  7. admin_password=admin
复制代码

具体的文件内容不清楚,[keystone_authtoken]后边一定有admin的行,而不是在这中间还有其他 []?
例如下边的情况有可能出现吗(这种情况应该是不修改)?
  1. [keystone_authtoken]
  2. 1
  3. 2
  4. 3
  5. [qww]
  6. admin_user=nova
  7. admin_password=abc1234
复制代码
使用while循环,引入flag即可解决
,如果不会,可提供示例,以及修改之后的结果

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
5 [报告]
发表于 2016-05-27 10:00 |只看该作者
回复 4# mswsg

  1. [default]
  2. #Default

  3. [keystone_authtoken]

  4. #
  5. # From keystonemiddleware.auth_token
  6. #
  7. # Service username. (string value)
  8. #admin_user=<None>
  9. admin_user=nova

  10. # Service user password. (string value)
  11. #admin_password=<None>
  12. admin_password=abc1234
  13. [libvirt]

  14. #
  15. # From nova.virt
  16. #
  17. # Service username. (string value)
  18. #admin_user=<None>
  19. admin_user=nova

  20. # Service user password. (string value)
  21. #admin_password=<None>
  22. admin_password=abc1234
  23. [nova]
  24. # Service username. (string value)
  25. #admin_user=<None>
  26. admin_user=nova

  27. # Service user password. (string value)
  28. #admin_password=<None>
  29. admin_password=abc1234
复制代码
即我只修改[keystone_authtoken] section 下的admin_user 和admin_password,
不修改出现在[libvirt] 下的admin_user 和admin_password。
我自己的实现是我强行把[keystone_authtoken]和[libvirt]这一段取出来,对这一段做字符串比较和替换。
请问用while ,引入flag 怎么写

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
6 [报告]
发表于 2016-05-27 10:26 |只看该作者
本帖最后由 mswsg 于 2016-05-27 10:31 编辑


试了试,还是使用for循环方便
  1. # encoding: utf-8
  2. flag = False
  3. with open('1.txt', 'r')as f:
  4.     for line in f:
  5.         line = line.strip()
  6.         if '[keystone_authtoken]' == line:  # []是结构快的开始行
  7.             flag = True
  8.             print line
  9.         elif flag:       #为假,直接执行最后的else语句,即直接原样打印文件;为真,则修改符合条件的行,不符合条件的行则不修改
  10.             if line.startswith('admin_user'):
  11.                 print 'admin_user=admin'
  12.             elif line.startswith('admin_password'):
  13.                 print 'admin_password=admin'
  14.                 flag = False    #admin_password 是结构快的结束行
  15.             else:
  16.                 print line
  17.         else:
  18.             print line
复制代码
结果:
  1. [default]
  2. #Default

  3. [keystone_authtoken]

  4. #
  5. # From keystonemiddleware.auth_token
  6. #
  7. # Service username. (string value)
  8. #admin_user=<None>
  9. admin_user=admin

  10. # Service user password. (string value)
  11. #admin_password=<None>
  12. admin_password=admin
  13. [libvirt]

  14. #
  15. # From nova.virt
  16. #
  17. # Service username. (string value)
  18. #admin_user=<None>
  19. admin_user=nova

  20. # Service user password. (string value)
  21. #admin_password=<None>
  22. admin_password=abc1234
  23. [nova]
  24. # Service username. (string value)
  25. #admin_user=<None>
  26. admin_user=nova

  27. # Service user password. (string value)
  28. #admin_password=<None>
  29. admin_password=abc1234
复制代码

论坛徽章:
13
CU大牛徽章
日期:2013-03-14 14:14:082016科比退役纪念章
日期:2016-07-22 11:15:35数据库技术版块每日发帖之星
日期:2016-05-27 06:20:002015亚冠之吉达阿赫利
日期:2015-08-05 10:06:542015年亚洲杯之韩国
日期:2015-04-01 16:05:42双鱼座
日期:2014-11-13 11:04:24丑牛
日期:2014-07-25 17:29:54子鼠
日期:2014-04-25 12:25:45丑牛
日期:2014-04-17 08:35:48巨蟹座
日期:2014-04-16 16:50:05CU大牛徽章
日期:2013-03-14 14:14:29CU大牛徽章
日期:2013-03-14 14:14:26
7 [报告]
发表于 2016-05-27 13:02 |只看该作者
谢谢,不错啊,我的实现要稍微死板一点了
  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)
复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
8 [报告]
发表于 2016-05-27 14:47 |只看该作者
本帖最后由 mswsg 于 2016-05-27 14:48 编辑

文件不是很大还好,如果很大,还是上边的效率高。能明白思路就好,下次碰见类似的会解决就行回复 7# hmchzb19


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP