2016-11-10 57 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()