免费注册 查看新帖 |

Chinaunix

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

字典赋值的报错 [复制链接]

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-17 16:46 |只看该作者 |倒序浏览
本帖最后由 wiliiwin 于 2014-11-17 17:23 编辑
  1. # more Master.conf
  2. [Master]
  3. host=192.168.100.62
  4. source=/home/master/tools
  5. md5sum=/home/master/tools/md5sum
  6. version=1.0.4

  7. [QA]
  8. host=192.168.100.61
  9. user=jqa
  10. tomcat=/home/jqa/opt/apache-tomcat-6.0.41/webapps
  11. db2=db2inst@db2inst

  12. [VIS]
  13. host=192.168.100.15
  14. user=jqa
  15. tomcat=/home/jqa/opt/apache-tomcat-6.0.41/webapps
  16. db2=db2inst@db2inst
复制代码
我想把此文件的[]里面的内容和=左边的值作为字典的key,和perl里面的哈希的哈希相似的字典,下面是我的代码
  1. #!/usr/bin/python
  2. import re

  3. hash={}
  4. fd=open('Master.conf','r')
  5. for  line in  fd:
  6.      flag=0
  7.      matchObj=re.match('\[(\w+)\]',line)
  8.      if matchObj:
  9.           outer_key=matchObj.group(1)     
  10.      elif flag==0:
  11.           matchobj=re.match('(.*?)=(.*)',line)
  12.           if matchobj:
  13.              hash[outer_key][matchobj.group(1)]=matchobj.group(2)
  14. #print hash[outer_key][matchobj.group(1)]
复制代码
执行这个脚本的时候,报了一个错误,
  1. 1.py
  2. Traceback (most recent call last):
  3.   File "./1.py", line 14, in ?
  4.     hash[outer_key][matchobj.group(1)]=matchobj.group(2)
  5. KeyError: 'Master'
复制代码
说是错误的键,不知道为什么会有这样的报错呢?请指教。

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
2 [报告]
发表于 2014-11-17 17:18 |只看该作者
本帖最后由 Linux_manne 于 2014-11-17 17:19 编辑

你这个hash 是dict 怎么能hash[][]
另外这个配置文件 为什么不用configparser 这个模块? 用文件读取多此一举..

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
3 [报告]
发表于 2014-11-17 17:26 |只看该作者
回复 2# Linux_manne

我之前学的是perl,现在才学习python,不想用模块,就想用自己的办法来完成一些文本处理,也是一种熟练python的一个过程。


你说的字典,我是要完成这样的字典

hash={xxx:{yyy:zzz}}

xxx等于是[]里面的内容,yyy等于是=左边的数值,zzz是=右边的数值

因此就出现了hash[XXX][YYY]=[ZZZ]
不知道你知道你清楚了吗?



   

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
4 [报告]
发表于 2014-11-17 17:29 |只看该作者
本帖最后由 Linux_manne 于 2014-11-17 17:31 编辑

hash[outer_key] = {matchobj.group(1):matchobj.group(2)}
但是由于你outer_key 下面有3个 所以都会被最后一个覆盖..

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
5 [报告]
发表于 2014-11-17 17:37 |只看该作者
本帖最后由 wiliiwin 于 2014-11-17 17:39 编辑

回复 4# Linux_manne
覆盖不了的  键不一样啊  怎么会覆盖   我最后有一个打印的语句,我只是要提现出来打印结果。


   

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
6 [报告]
发表于 2014-11-17 17:39 |只看该作者
回复 5# wiliiwin


     那种形式差不多就是你要得吧? 自己在修修

论坛徽章:
0
7 [报告]
发表于 2014-11-17 19:37 |只看该作者
回复 1# wiliiwin

你的问题的原因是value 没有追加,总是覆盖前一个的值。
  1. #!/user/bin/python
  2. import re

  3. dictory = {}
  4. dict1 = {}

  5. fd=open("data.txt")

  6. for line in fd.readlines():
  7.     matchObj = re.search('\[(.+)\]', line)
  8.     if matchObj:
  9.         outer_key = matchObj.group(1)
  10.         #print outer_key
  11.     else:
  12.         matchobj = re.search('(.*)\s*=\s*(.*)', line)
  13.         if matchobj:
  14.             key = matchobj.group(1)
  15.             #print key
  16.             value = matchobj.group(2)
  17.             #print value
  18.             dict0 = {}
  19.             dict0 = {key : value}
  20.             dict1 = dict( dict0.items() + dict1.items() )
  21.             dictory[outer_key] = dict1
  22.             
  23. print dictory
  24. print dictory['VIS']
  25. print dictory['VIS']['host']
复制代码
  1. {'QA': {'tomcat': '/home/jqa/opt/apache-tomcat-6.0.41/webapps', 'md5sum': '/home/master/tools/md5sum', 'source': '/home/master/tools', 'host': '192.168.100.62', 'version': '1.0.4', 'user': 'jqa', 'db2': 'db2inst@db2inst'}, 'VIS': {'tomcat': '/home/jqa/opt/apache-tomcat-6.0.41/webapps', 'md5sum': '/home/master/tools/md5sum', 'source': '/home/master/tools', 'host': '192.168.100.62', 'version': '1.0.4', 'user': 'jqa', 'db2': 'db2inst@db2inst'}, 'Master': {'source': '/home/master/tools', 'host': '192.168.100.62', 'version': '1.0.4', 'md5sum': '/home/master/tools/md5sum'}}
  2. {'tomcat': '/home/jqa/opt/apache-tomcat-6.0.41/webapps', 'md5sum': '/home/master/tools/md5sum', 'source': '/home/master/tools', 'host': '192.168.100.62', 'version': '1.0.4', 'user': 'jqa', 'db2': 'db2inst@db2inst'}
  3. 192.168.100.62
  4.    
复制代码

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
8 [报告]
发表于 2014-11-17 19:52 |只看该作者
回复 7# 609854
不是追加的问题,我打印是在循环里面的。现在问题是报key的错误。


   

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
9 [报告]
发表于 2014-11-17 20:16 |只看该作者
本帖最后由 wiliiwin 于 2014-11-17 20:35 编辑

python貌似不支持直接用dict[][]这种方式来赋值的。
  1. #!/usr/bin/perl
  2. my $hash;

  3. $hash{'a'}{'b'}='c';
  4. $hash{'a'}{'e'}='f';
  5. printf  "$hash{'a'}{'b'}\n";
  6. printf  "$hash{'a'}{'e'}\n";
复制代码
  1. # ./1.pl
  2. c
  3. f
复制代码
  1. # more test.py
  2. #!/usr/bin/python

  3. dict={}

  4. dict['a']['b']='c'
  5. print dict['a']['b']

  6. [code]# ./test.py
  7. Traceback (most recent call last):
  8.   File "./test.py", line 5, in ?
  9.     dict['a']['b']='c'
  10. KeyError: 'a'
复制代码

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
10 [报告]
发表于 2014-11-18 09:11 |只看该作者
本帖最后由 Linux_manne 于 2014-11-20 09:13 编辑

回复 9# wiliiwin


     哦 之前说错了。。 是可以那样附值的... 只是你先要构造出{key:{key:vaule}} 这种形式, 单独{} 这样的形式 d[][] 肯定会不对.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP