2016-12-06 2 views
0

У меня возникли проблемы с передачей строковой переменной в функцию поиска.Как передать переменную строки в функцию поиска?

Вот что я пытаюсь выполнить:
У меня есть файл, полный значений, и я хочу проверить файл, чтобы убедиться, что определенная строка соответствия существует до того, как я начну. Я хочу убедиться, что существует строка <endSW=UNIQUE-DNS-NAME-HERE<>, если существует действительный <begSW=UNIQUE-DNS-NAME-HERE<> и доступен.

Все работает нормально, пока я не позвоню if searchForString(searchString,fileLoc):, который всегда возвращает false. Если я присваиваю переменной «searchString» прямое значение и передаю ее, она будет работать, поэтому я знаю, что это должно быть что-то с моим сочетанием строк, но я не могу понять, что я делаю неправильно.

Если я анализирую данные, что «searchForString» использует я вижу, что, как представляется, действительные значения:

values in fileLines list: 

['<begSW=UNIQUE-DNS-NAME-HERE<>', ' <begPortType=UNIQUE-PORT-HERE<>', '  <portNumbers=80,443,22<>', ' <endPortType=UNIQUE-PORT-HERE<>', '<endSW=UNIQUE-DNS-NAME-HERE<>'] 

value of searchVar: 

<endSW=UNIQUE-DNS-NAME-HERE<> 

Пример записи в файле:

<begSW=UNIQUE-DNS-NAME-HERE<> 
    <begPortType=UNIQUE-PORT-HERE<> 
     <portNumbers=80,443,22<> 
    <endPortType=UNIQUE-PORT-HERE<> 
<endSW=UNIQUE-DNS-NAME-HERE<> 

Здесь код, о котором идет речь:

def searchForString(searchVar,readFile): 
    with open(readFile) as findMe: 
     fileLines = findMe.read().splitlines() 
     print fileLines 
     print searchVar 
     if searchVar in fileLines: 
      return True 
     return False 
    findMe.close() 

fileLoc = '/dir/folder/file' 
fileLoc.lstrip() 
fileLoc.rstrip() 
with open(fileLoc,'r') as switchFile: 
    for line in switchFile: 
     #declare all the vars we need 
     lineDelimiter = '#' 
     endLine = '<>\n' 
     begSWLine= '<begSW=' 
     endSWLine = '<endSW=' 
     begPortType = '<begPortType=' 
     endPortType = '<endPortType=' 
     portNumList = '<portNumbers=' 
     #skip over commented lines -(REMOVE THIS) 
     if line.startswith(lineDelimiter): 
      pass 
     #checks the file for a valid switch name 
     #checks to see if the host is up and reachable 
     #checks to see if there is a file input is valid 
     if line.startswith(begSWLine): 
      #extract switch name from file 
      switchName = line[7:-3] 
      #check to make sure switch is up 
      if pingCheck(switchName): 
       print 'Ping success. Host is reachable.' 
       searchString = endSWLine+switchName+'<>' 
       **#THIS PART IS SUCKING, WORKS WITH DIRECT STRING PASS 
       #WONT WORK WITH A VARIABLE** 
       if searchForString(searchString,fileLoc): 
        print 'found!' 
       else: 
        print 'not found' 

Любые советы или рекомендации будут очень полезными.

+0

После некоторого большего чтения я решил изменить входной текстовый файл на XML и использовать встроенные библиотеки. –

ответ

0

Трудно сказать, без содержимого файла, но я хотел бы попробовать

switchName = line[7:-2] 

Так что будет выглядеть

>>> '<begSW=UNIQUE-DNS-NAME-HERE<>'[7:-2] 
'UNIQUE-DNS-NAME-HERE' 

Кроме того, вы можете посмотреть в регулярных выражений поиска, чтобы сделать вашу очистку более универсальным.

import re 
# re.findall(search_expression, string_to_search) 

>>> re.findall('\=(.+)(?:\<)', '<begSW=UNIQUE-DNS-NAME-HERE<>')[0] 
'UNIQUE-DNS-NAME-HERE' 

>>> e.findall('\=(.+)(?:\<)', '  <portNumbers=80,443,22<>')[0] 
'80,443,22' 
+0

Ниже приведен пример содержимого файла:

+0

Убедитесь, что вы получаете массив ['', '', ' ', ' ', ' '] Без этого, «для линии в switchFile:» не будет работать – Neil

Смежные вопросы