这是我的代码:
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一个字符串值,这恰好是第二个文件中的第一行。显然不起作用。
感谢您的帮助。
答案 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)