我正试图压缩一个非常大的日志文件,为此,我必须删除包含字符串“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()

你可以把注意力集中在脚本的末尾来回答我的问题,真的……不管怎样,我不知道为什么这不起作用……它仍然输出每一行。我已经试着改变了not的位置,这样它就可以更加有意义了,但是它并没有改变任何代码。感谢您的帮助:)

最佳答案

问题不在于你对not的使用,而是or并不意味着你认为它能做什么(如果你仔细考虑,它就不能做到):

if not ("StatusRequest" or "StatusResponse") in line:

您在问表达式是否出现在("StatusRequest" or "StatusResponse")中。但是这个表达式和line是一样的。
用英语说:你不想说“如果两者都不在一条线上”。python没有"StatusRequest"/neither函数,但它有一个none函数,因此可以这样做:
if not any(value in line for value in ("StatusRequest", "StatusResponse")):

这不像英语那么好;在英语中,你可以说“如果‘statusRequest’和‘statusResponse’的值都不在一行”,但在python中,你必须说“如果没有一个值在一行,那么对于‘statusRequest’和‘statusResponse’”。
或者,更简单地说,在这种情况下:
if "StatusRequest" not in line and "StatusResponse" not in line:

(另外,请注意,您可以使用any,而不是使用not in然后否定整个内容。)

07-26 05:15