2015-01-20 4 views
-1

Я пытаюсь получить значения из файла журнала, используя регулярное выражение Python, и в этом процессе у меня есть несколько операторов if. Раздел кода, который захватывает значения следующим образом:Python multiple if statements

# Opening the log file for reading 
with open(logFile, 'r') as logfile_read: 
for line in logfile_read: 
    line = line.rstrip() 

# To extract Time or iteration 
    if 'Time' in line: 
     iteration_time = re.findall(r'^Time\s+=\s+(.*)', line) 

# To extract local, global and cumulative values 

    if 'local' in line: 
     local_global_cumu = re.search(r'sum\s+local\s+=\s+(.*),\s+global\s+=\s+(.*),\s+cumulative\s+=\s+(.*)', line) 
     if local_global_cumu: 
      contLocal_0_value = local_global_cumu.group(1) 
      contGlobal_0_value = local_global_cumu.group(2) 
      contCumulative_0_value = local_global_cumu.group(3) 
     for t in iteration_time: 
      contLocal.write("%s\t%s\n" %(t, contLocal_0_value)) 
      contGlobal.write("%s\t%s\n" %(t, contGlobal_0_value)) 
      contCumulative.write("%s\t%s\n" %(t, contCumulative_0_value)) 

    # To extract execution and cpu time 

    if 'ExecutionTime' in line: 
     execution_cpu_time = re.search(r'^ExecutionTime\s+=\s+(.*)\s+s\s+ClockTime\s+=\s+(.*)\s+s', line) 
     if execution_cpu_time: 
      execution_time_0_value = execution_cpu_time.group(1) 
      cpu_time_0_value = execution_cpu_time.group(2) 
     for t in iteration_time: 
      print t 

Во втором if заявление, я могу получить значения из t. Однако в последующем заявлении if, когда я пытаюсь сделать print t, ничего не приходит. Я не знаю, где я ошибся.

+2

Если это не петля. [И вы используете, если неправильно.] (Http://stackoverflow.com/questions/20002503/why-does-ab-or-c-or-d-always-evaluate-to-true) –

+0

Я бы предположил что 'iteration_time' пуст, или тело' if ('ExecutionTime' или 'ClockTime') в строке: 'никогда не выполняется. –

+0

Спасибо @Ashwini Chaudhary. Можете ли вы дать мне несколько намеков? – hypersonics

ответ

1

следующие проверки, если «время» подстроки в строке, а затем пытается найти все матчи на этой линии, которая начинается с «Время» ...

if 'Time' in line: 
    iteration_time = re.findall(r'^Time\s+=\s+(.*)', line) 

Следующая также содержит слово «Time»:

if 'ExecutionTime' in line: 
    execution_cpu_time = re.search(r'^ExecutionTime\s+=\s+(.*)\s+s\s+ClockTime\s+=\s+(.*)\s+s', line) 

Когда попытки перебирает iteration_time будет пусто, как и предыдущим if уже бежать и состояние й при этом начинается с «Время» означает, что вы получаете пустой список для своих совпадений.

Давайте просто делать вид, у вас есть одна строка, начиная с «ExecutionTime», и давайте пройдем через это ...

  • if 'Time' in line является истинным, поэтому re.findall работает и возвращает все матчи на линии этой начинается с «Time» ... Это будет пустым, потому что линия не начинается с «Time» - так iteration_time = []
  • if 'ExecutionTime' in line верно, и линия делает начинаем с 'ExecutionTime', когда вы делаете for t in iteration_time - он не будет зацикливаться, потому что выше установленный он будет пустым!
+0

Спасибо @Jon Clements. В моем файле журнала 'Time' и' ExecutionTime' находятся в двух разных строках, а также в синтаксисе для regex используется '^', который проверяет только строку, начиная с. И мои «Time», и «ExecutionTime» находятся в начале двух разных строк. – hypersonics

+0

Да, но «Время» находится в «ExecutionTime», что означает, что первое 'if' действительно выполняется ... findall ничего не вернет, потому что строка ** не начинается ** с« Time », она начинается с« ExecutionTime », ... возьми? Поэтому, когда выполняется блок 'if 'ExecutionTime',' iteration_time' будет опустошен первым, если ... –

+0

Спасибо @JonClements. Тем не менее, я все еще немного смущен. Посмотрите мой типичный файл журнала здесь: http://stackoverflow.com/questions/28017121/extracting-multiple-strings-using-pythonss-regular-expression/28017210?noredirect=1#comment44422473_28017210 – hypersonics