2015-01-27 2 views
0

Я хочу сохранить вывод telnet в строковой переменной и проанализировать его, чтобы получить нужную мне информацию, подобно тому, как я должен был вывести ее в файл и проанализировать через нее (этот способ Мне не нужно).Проанализируйте переменную в python

В настоящее время я пытаюсь использовать аргумент «для строки» так же, как и с текстовым документом, но, похоже, он не распознает отдельные строки в переменной (изменяется ли строковая переменная форматирование или нет. не уверен).

Все сценарии Telnet работают правильно, поскольку я ранее выводил их в текстовые файлы и разбирался в них таким образом, я просто пытаюсь устранить шаг.

Вот пример телнета получить просьбу об

tn.write("SomeCommand::SOMEPARAMETERS;\n") 
tn.read_until(" EN=0 ENDESC=Succeeded.", TIMEOUT) 
output = tn.read_very_eager() 

Вот пример вывода телнета

Description of Information 
----------------------------------------- 
Name1  Name2  Name3  Name4  
example1 exampe2 example3 example4 
----------------------------------------- 

Вот что я написал, чтобы попытаться разобрать и через это.

array = [] 

for line in output: # Read lines from CPU MEM TEMP 
    if "example1" in line: 
     for word in line.split(): 
      array.append(word) 

Name1 = array[0] 
Name2 = array[1] 
Name3 = array[2] 
Name4 = array[3] 

print (Name1 + Name2 + Name3, etc....) 

Может кто-нибудь пролить некоторый свет на Wheter я имею право идея с этим, или это должно быть сделано совершенно diffrent способ просто разбора через текстовый файл (который я работаю, используя аналогичный код)

Спасибо всем

+0

вы уверены, что' read_very_eager' возвращает список строк? Если он возвращает весь текст как одну строку, то 'для строки в выводе' фактически проверяет один символ за раз. В этом случае вам придется сначала разбить его по строкам. – Roberto

+1

Хммм, кажется, ты прав. Я только что протестировал его, тогда только поиск «e» (как в начале примера), и он вернул его. – Billiam

+0

Как бы я решил сначала разделить его на строки? – Billiam

ответ

1

Вы должны разделить вывод в строках первого (я предполагаю, что строки разделяются символом новой строки):

for line in output.splitlines(): # Read lines from CPU MEM TEMP 
    if "example1" in line: 
     for word in line.split(): 
      array.append(word) 

(Edit: заменить .split('\n') с .splitlines() согласно @PaulMcGuire «ы предложение)

+0

Ты потрясающий. Все работает сейчас! – Billiam

+1

Рассмотрите возможность использования 'output.splitlines()' вместо 'output.split ('\ n')'. 'splitlines' заботится о Windows и Unix EOL, * и * не требует никаких уродливых обратных косых черт. – PaulMcG

+0

@PaulMcGuire спасибо, ты совершенно прав. Я обновил свой ответ. – Roberto

0

Я хотел бы сделать это с регулярными выражениями:

import re 

array = [] 

lines = output.split('\n') 

for line in lines: # Read lines from CPU MEM TEMP 
    if re.search('example1', line): 
     line = re.sub(r'\s+', ' ', line) 
     for word in line.split(' '): 
      array.append(word) 

print array 

Этот код печатает следующий вывод:

['example1', 'exampe2', 'example3', 'example4'] 
+0

Спасибо за наш ответ. Имеет ли это преимущество перед тем, как я это делаю сейчас. Я волнуюсь, что если значение появляется как null (через telnet), скрипт получит неправильное значение, которое я предполагаю, что регулярные выражения помогут. – Billiam

+0

Я думаю, что это не имеет никакого преимущества для вашего пути. Честно говоря, мое решение основано на непонимании метода 'split()' (я новичок в Python xD). Я думаю, что у @Roberto есть правильное решение, как вы отметили. Однако регулярные выражения могут быть более универсальными, поэтому в будущем вам могут понадобиться эти приложения для синтаксического анализа. – Txarli

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