当前位置: 首页 > 面试题库 >

读取文件时脚本跳过第二个for循环

浦琪
2023-03-14
问题内容

我正在尝试读取日志文件,并将某些值与预设阈值进行比较。我的代码设法通过for函数中的第一个循环记录原始数据。

添加了打印语句以尝试弄清楚发生了什么,并且我已经推断出我的第二个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')

我尝试谷歌搜索类似的问题,但没有发现。我尝试将我的第一个for循环移入,diskOne()但是发生相同的问题。目前没有语法错误,我现在无法看到该问题。


问题答案:

它不会跳过您的第二个循环。您需要seek将位置放回原处。这是因为在读取文件后,文件偏移量将被放置在文件的末尾,因此您需要将其放回开头。只需添加一行即可轻松完成

datafile.seek(0);

在第二个循环之前。

参考:文档



 类似资料:
  • 当使用扫描仪对象从文本文件中读取时,我希望它跳过文件中的第一行。我该怎么做?

  • 问题内容: 我有一个笨拙的csv文件,我需要跳过第一行来阅读它。 我正在使用python / pandas轻松做到这一点 但是我不知道如何在Go中做到这一点。 错误: : 问题答案: 读取csv文件时跳过第一行 例如, 输出:

  • 问题内容: 使用扫描程序对象从文本文件读取时,我希望它跳过文件的第一行。我将如何做到这一点? 问题答案: 只需在while循环之前使用即可。如JavaDoc中所述,这将跳过第一行。 还有关于您的命名的注释。Java语言具有广泛接受的约定。类名总是以大写字母开头,变量名总是以小写字母开头(常量除外,但现在不必担心)。在这里阅读更多。

  • 在 Mule 4 中,我正在读取一个大型 csv 文件进行转换,需要将内容写入数据库表。csv 文件没有标头。当我默认运行集成时,第一行被跳过,就好像默认值被预先确定为标题一样。 我看了一下应用程序类型。xml,看起来头被设置为false,如下所示 任何建议都将不胜感激。谢谢

  • 问题内容: 在python中,我该怎么做: 问题答案: 其他答案仅适用于序列。 对于任何迭代,请跳过第一项: 如果要跳过最后一个,可以执行以下操作:

  • 我有一个简单的要求:在我的npm脚本包中。json文件我有一行: 现在我想把“域”分解出来。 首先尝试使用,它有效: 但我想从本地加载域。env文件。 我没有找到任何解决方案来读取命令行上npm脚本中的env文件内容。 谁能给我一个可能解决这个问题的提示吗?