如何在Python中重置for计数器?

1 投票
4 回答
2300 浏览
提问于 2025-04-30 16:13

这是我的代码:

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()

简单来说,我有一个脚本,它是从一个程序中提取出来的,然后要放到另一个程序里。但是在放入第二个程序时,有一份不允许使用的命令列表,所以我写了这段小代码,目的是把那些不允许的命令前面加上“#”来注释掉。至于怎么正确打印出这个不允许的命令列表,我稍后再处理,现在我只想要那些被注释掉的命令。

当我运行这段代码时,它第一次进入第一个循环,然后在第二个循环中转了一圈,直到文件的末尾。接着又回到第一个循环,但这次少了第一个值,再也没有进入第二个循环。我不太明白Python中的循环计数器是怎么工作的;“badCmd”和“myCmd”是字符串还是整数?它们打印出来像字符串,但计算起来又像整数。你可以看到我注释掉的那一行,我试图通过给myCmd一个字符串值(恰好是第二个文件中的第一行)来重启第二个循环的计数器,但显然这样做不行。

谢谢任何帮助。

暂无标签

4 个回答

0

迭代器是用来处理数据的一种工具,它会根据你放进去的数据类型来定义自己在循环中要处理的元素。

比如说,如果你有一个列表 [1, "Hello", 2, "Goodbye"],当你遍历这个列表时,迭代器会先处理一个整数(1),接着是一个字符串("Hello"),然后又是一个整数(2),最后是另一个字符串("Goodbye")。

如果你觉得这样处理会有问题,你可以在循环里把所有的元素都转换成字符串,这样就能统一了。其实你可能根本不需要用到错误处理的机制。

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)
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()
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)

撰写回答