我正在尝试压缩一个非常大的日志文件,为此,我必须删除包含字符串的每一行" StatusRequest"和" StatusResponse",同时打印没有此字符串的其他行。到目前为止我的代码如下(从命令提示符运行):
if (sys.argv[1])=="--help": print ("\n") print ("Argument 1: Enter name of '.py' file") print ("-i or --input: name of Catalina log") print ("-o or --output: file to output to") print ("\n") if (sys.argv[1])=="-h": print ("\n") print ("Argument 1: Enter name of '.py' file") print ("-i or --input: name of Catalina log") print ("-o or --output: file to output to") print ("\n") else: print 'Number of arguments:', len(sys.argv), 'arguments.' print 'Argument List:', str(sys.argv) Numarg = (len(sys.argv)) i=1 while i<=(Numarg-4): search1="StatusRequest" search2="StatusResponse" if (sys.argv[Numarg-2])=="-o": outputfile=sys.argv[Numarg-1] if (sys.argv[Numarg-2])=="--output": outputfile=sys.argv[Numarg-1] if (sys.argv[i])=="-i": filename=(sys.argv[i+1]) log=(filename) print ("You entered the log: " + log) f=open(log, 'r') read_data = f.read() f.close f=open(log, 'r') readlines_data=f.readlines() f.close() i=i+1 if (sys.argv[i])=="--input": filename=(sys.argv[i+1]) log=(filename) print ("You entered the log: " + log) f=open(log, 'r') read_data = f.read() f.close f=open(log, 'r') readlines_data=f.readlines() f.close() i=i+1 for line in readlines_data: if not ("StatusRequest" or "StatusResponse") in line: result=line print (line) f=open(outputfile, 'a') f.write(result + "\n") f.close()
你可以专注于脚本的结尾来回答我的问题,真的......无论如何,我不确定为什么这不起作用......它仍在输出每一行。而且我已经尝试过切换不是这样的位置,这会更具意义,但它并没有用代码改变任何东西。非常感谢任何帮助:)
答案 0 :(得分:13)
问题不在于你使用not
,or
并不代表你的想法(如果你认为它是这样的话) couldn&#39;吨):
if not ("StatusRequest" or "StatusResponse") in line:
您是否在("StatusRequest" or "StatusResponse")
询问表达式line
。但是这个表达与"StatusRequest"
只是一样。
用英语说:你不想说&#34;如果这些都不符合#34;。 Python没有neither
/ none
函数,但它确实有any
函数,所以你可以这样做:
if not any(value in line for value in ("StatusRequest", "StatusResponse")):
这并不像英语那么好;在英语中,你可以说&#34;如果没有任何值&#39; StatusRequest&#39;和&#39; StatusResponse&#39;排在第34位,但是在Python中,你必须说&#34;如果没有任何值出现,对于值&#39; StatusRequest&#39;和&#39; StatusResponse&#39;&#34;。
或者,在这种情况下可能更简单:
if "StatusRequest" not in line and "StatusResponse" not in line:
(另请注意,您可以使用not in
,而不是使用in
然后否定整个事情。)
答案 1 :(得分:2)
替换此行:
if not ("StatusRequest" or "StatusResponse") in line:
有了这个:
if "StatusRequest" not in line and "StatusResponse" not in line:
不是超级优雅,但它会做到这一点。我不确定是否有更快的方法将两个字符串与同一行进行比较。
答案 2 :(得分:0)
您必须单独列出每个条件:
for line in readlines_data:
if ("StatusRequest" not in line) and "(StatusResponse" not in line):
result = line
print(line)
答案 3 :(得分:0)
not
可以用来否定括号内的表达式,就像你第一次使用它一样。你只需要修改它的否定,即在line
中找到字符串:
if not ("StatusRequest" in line or "StatusResponse" in line):