2015-03-06 1 views
2

Я пытаюсь прочитать файл журнала и сравнить определенные значения с установленными порогами. Мой код управляет регистрацией исходных данных с помощью первого цикла for в моей функции.Скрипт пропускает второй цикл при чтении файла

Я добавил операторы печати, чтобы попытаться выяснить, что происходит, и мне удалось сделать вывод, что мой второй цикл никогда не «случается».

Это мой код:

def smartTest(log, passed_file):  
    # Threshold values based on averages, subject to change if need be 
    RRER = 5 
    SER = 5 
    OU = 5 
    UDMA = 5 
    MZER = 5 
    datafile = passed_file 
    # Log the raw data  
    log.write('=== LOGGING RAW DATA FROM SMART TEST===\r\n') 
    for line in datafile: 
     log.write(line) 
     log.write('=== END OF RAW DATA===\r\n') 

     print 'Checking SMART parameters...', 
     log.write('=== VERIFYING SMART PARAMETERS ===\r\n') 

     for line in datafile: 
      if 'Raw_Read_Error_Rate' in line: 
       line = line.split() 
       if int(line[9]) < RRER and datafile == 'diskOne.txt': 
        log.write("Raw_Read_Error_Rate SMART parameter is: %s. Value under threshold. DISK ONE OK!\r\n" %int(line[9])) 
       elif int(line[9]) < RRER and datafile == 'diskTwo.txt': 
        log.write("Raw_Read_Error_Rate SMART parameter is: %s. Value under threshold. DISK TWO OK!\r\n" %int(line[9])) 
       else: 
        print 'FAILED' 
        log.write("WARNING: Raw_Read_Error_Rate SMART parameter is: %s. Value over threshold!\r\n" %int(line[9])) 
        rcode = mbox(u'Attention!', u'One or more hardrives may need replacement.', 0x30) 

Это, как я называю эту функцию:

dataOne = diskOne() 
smartTest(log, dataOne) 
print 'Disk One Done' 

diskOne() выглядит следующим образом:

def diskOne(): 
    if os.path.exists(r"C:\Dejero\HDD Guardian 0.6.1\Smartctl"): 
     os.chdir(r"C:\Dejero\HDD Guardian 0.6.1\Smartctl") 
     os.system("Smartctl -a /dev/csmi0,0 > C:\Dejero\Installation-Scripts\diskOne.txt") 
     # Store file in variable 
     os.chdir(r"C:\Dejero\Installation-Scripts") 
     datafile = open('diskOne.txt', 'rb') 
     return datafile 
    else: 
     log.write('Smart utility not found.\r\n') 

Я попытался прибегая к помощи подобных вопросов к моему и не нашел никого. Я попытался переместить мой первый цикл в diskOne(), но та же проблема возникает. Синтаксической ошибки нет, и я просто не могу увидеть проблему на этом этапе.

ответ

7

Это не пропуск вашей второй петли. Вам нужно вернуть seek. Это связано с тем, что после прочтения файла смещение файла будет помещено в конец файла, поэтому вам нужно будет вернуть его в начале. Это можно сделать легко, добавив строку

datafile.seek(0); 

Перед вторым циклом.

Код: Documentation