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

позволяет говорить строки = «ххх», заменить текст спичку, он работает, потому что это первая заменить стать "%s %s" % (tagname, tagname)

, когда замена текста не совпадают, то это не получится потому что она стала оригинальной линией 'xxx' % (tagname, tagname) , таким образом, ошибка

ошибка может быть также исправить путем изменения, если части в

if " ('end_tags'," in line: 
  • исправить неправильный кронштейн
  • Как отмечает Люк Woodward, ваш, если проверка не соответствует текстовой части замены, на самом деле вы можете удалить, если часть, код будет работать также в качестве замены не будет когда заменить текст не соответствует
  • вместо%, предлагают использовать строка формата line = line.replace("xxx", "{0} {0}".format(tagname) )
+0

Все - спасибо за ваш вклад Мне нужно добавить в три раза. скобки к соответствующему тексту, чтобы заставить это работать. Теперь он работает в цикле без ошибок. – DRO

0

Все - спасибо за ваш он лейбористская партия Мне нужно было добавить тройные кавычки, чтобы заставить это работать над соответствующей строкой. ?

окончательный код:

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() 
Смежные вопросы