2016-11-10 55 views
0

我正在尝试使用FileInput替换文件中的某一行,如果该行中有某个字。它基本上附加到一个文件。它运行但给我一个TypeError,我试图找出错误的位置。运行函数时出现类型错误

tagname = 'somestring' 
def add_tags(): 
     for line in fileinput.FileInput('/tmp/hosttags.mk',inplace=1): 
      if 'end_tags' in line: 
       line = line.replace(""" ('end_tags',""", """('%s', 
u'/%s', 
[('%s', u'%s tag', [])]), 
('end_tags', 
u'testing/end_tags_start', 
[('end_tag_id', u'end_tag_description', [])])]""") % (tagname, tagname, tagname, tagname) 
      print line.strip() 

错误:文件的

Traceback (most recent call last): 
    File "./tag_update.py", line 57, in <module> 
    checkmk_srv_tag_update() 
    File "./tag_update.py", line 54, in checkmk_srv_tag_update 
    add_tags() 
    File "./tag_update.py", line 45, in add_tags 
    [('end_tag_id', u'end_tag_description', [])])]""") % (tagname, tagname, tagname, tagname) 
TypeError: not all arguments converted during string formatting 

最终的结果被更新:

('house', 
u'/house', 
[('house', u'house tag', [])]), 
('somestring', 
u'/somestring', 
[('somestring', u'somestring tag', [])]), 
('end_tags', 
u'testing/end_tags_start', 
[('end_tag_id', u'end_tag_description', [])])] 

感谢

+0

如果行包含'end_tags'而不是'(“end_tags”会发生什么,' –

+0

它的行 – DRO

回答

0

你错误地把你的支架,你基本上是在做

line = line.replace("xxx", "%s %s") % (tagname, tagname) 

其中其假设是

line = line.replace("xxx", "%s %s" % (tagname, tagname)) 

可以说,行=“XXX”,替换文本匹配,将作品,因为它第一次顶替成为"%s %s" % (tagname, tagname)

时替换文本不匹配,就会失败因为它成为 原线'xxx' % (tagname, tagname) ,从而错误

该错误也可以固定通过改变如果部分成

if " ('end_tags'," in line: 
  • 修正错误的托架
  • 作为卢克伍德沃德提,你如果检查是 不匹配替换文本部分,其实你可以删除if部分,代码将也作为替换不会发生当 替换文本不匹配
  • 代替%,建议使用字符串 格式 line = line.replace("xxx", "{0} {0}".format(tagname) )
+0

所有比赛方括号到匹配的文本以使其起作用,现在可以在循环中正常工作而不会出错。 – DRO

0

全部 - 谢谢你的他LP。我需要添加三重引号才能使它在匹配字符串上工作。 ?

最终代码: - 感谢您输入我需要添加三重

def srv_tags_update(): 

     tags_set = [] 
     for host,tags in ipa_hostgroups_dict.iteritems(): 
      tags_set += tags 

     for host_tag in set(tags_set): 
      for line in fileinput.FileInput('/tmp/hosttags.mk',inplace=1): 
      #if 'end_tags' in line: 
       if """('end_tags',""" in line: 
        line = line.replace(""" ('end_tags',""", """('%s', 
u'/%s', 
[('%s', u'%s tag', [])]), 
('end_tags', 
""") % (host_tag, host_tag, host_tag, host_tag ) 
       print line.strip()