如何重置Python中的计数器?

时间:2014-10-30 16:37:50

标签: python for-loop

这是我的代码:

class badCmds:
    def removeCmds(self):
        fname = input("Enter bad command list filename")
        badCmdList = open(fname, "r")
        fname2 = input("Enter your script's filename")
        myScript = open(fname2, "r")
        commentedCmd = ""
        for badCmd in badCmdList:
            #myCmd = "#Script Generated by HP SSO Administrator";
            for myCmd in myScript:
                if badCmd in myCmd:
                    commentedCmd = "#"+myCmd
                    print(commentedCmd)

badCmds().removeCmds()

基本上,我有一个脚本,我从某个程序中拉出来放入另一个程序。但是,当将它放入第二个程序时,有一个不允许的命令列表,因此我尝试编写这个小代码来注释掉(“#”)任何不允许的命令。我担心以后会正确打印列表,因为现在我想要的是哈希命令。

当我运行这段代码时,它第一次触及第一个循环,旋转第二个循环,直到它到达文件末尾,然后旋转第一个循环,减去第一个值,再也不进入第二个循环环。我真的不明白For Counter在Python中是如何工作的;是“badCmd”和“myCmd”字符串还是整数?它们像字符串一样打印,但算起来就像整数。您可以看到我注释掉的行,我尝试在第二个For循环中重新启动计数器,方法是给myCmd一个字符串值,这恰好是第二个文件中的第一行。显然不起作用。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

myScript是一个打开的文件 - 在第一次运行它之后,文件指针位于文件的末尾,未来的迭代没有其他任何东西可以返回。您可以使用myScript.seek(0,0)重置文件指针,但这是将整个文件读入列表的一个很好的用例。

class badCmds:
    def removeCmds(self):
        fname = input("Enter bad command list filename")
        badCmdList = open(fname)
        fname2 = input("Enter your script's filename")
        myScript = open(fname2).readlines()
        commentedCmd = ""
        for badCmd in badCmdList:
            #myCmd = "#Script Generated by HP SSO Administrator";
            for myCmd in myScript:
                if badCmd in myCmd:
                    commentedCmd = "#"+myCmd
                    print(commentedCmd)

答案 1 :(得分:1)

在文件上使用in将一次获得一行,直到它到达文件末尾。当再次尝试在文件上使用in时,它会失败,因为您已经到达了文件的末尾。

这意味着您有两种选择。将文件保存在列表中,或每次打开它。

同样在python中打开文件时最好使用with关键字,因为它会处理文件错误并为您关闭文件。

class badCmds:
    def removeCmds(self):
        badCmdFileName   = input("Enter bad command list filename")
        myScriptFileName = input("Enter your script's filename")
        with open(badCmdFileName, "r") as badCmdFile:
            for badCmd in badCmdFile:
                with open(myScriptFileName, "r") as myScriptFile:
                    for myCmd in myScriptFile:
                        if badCmd in myCmd:
                            print("#" + myCmd)

badCmds().removeCmds()

答案 2 :(得分:0)

迭代器采用放在其中的数据类型,定义为在循环中迭代的集合中的元素。

所以如果你有某种类似的列表,如[1," Hello",2," Goodbye"]并迭代它,迭代器将是一个int,然后是一个str ,然后是一个int,然后是一个str。

如果它成为一个问题,你总是可以通过转换for循环中的迭代器来强制所有东西成为字符串。你可能甚至不需要尝试/除此之外。

答案 3 :(得分:0)

该代码有点过于循环。您应该将错误的命令列表存储在内存中,这样您就不需要一次又一次地从文件中读取它。你应该利用列表推导,这样你就不需要重置任何计数器了:

def removeCmds():
    fname = input("Enter bad command list filename")    
    fname2 = input("Enter your script's filename")

    # load files to lists
    badCmdList = [line.strip() for line in open(fname, "r") if line.strip()]
    myScript = [line.rstrip() for line in open(fname2, "r")]

    # print filtered commands
    for cmd in myScript:
        # here comes the magic:
        if any(bad in cmd for bad in badCmdList)
            print("#"+cmd)