如何在Python中重置for计数器?
这是我的代码:
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 个回答
迭代器是用来处理数据的一种工具,它会根据你放进去的数据类型来定义自己在循环中要处理的元素。
比如说,如果你有一个列表 [1, "Hello", 2, "Goodbye"],当你遍历这个列表时,迭代器会先处理一个整数(1),接着是一个字符串("Hello"),然后又是一个整数(2),最后是另一个字符串("Goodbye")。
如果你觉得这样处理会有问题,你可以在循环里把所有的元素都转换成字符串,这样就能统一了。其实你可能根本不需要用到错误处理的机制。
这段代码有点复杂。你应该把错误命令的列表存储在内存中,这样就不用每次都从文件里读取了。而且,你可以使用列表推导式,这样就不需要重置任何计数器了。
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)
使用 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()
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)