在python中,如何打印不包含某个字符串的行,而不是打印包含某个字符串的行:

时间:2014-07-30 19:06:20

标签: python python-2.7 if-statement printing contains

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

你可以专注于脚本的结尾来回答我的问题,真的......无论如何,我不确定为什么这不起作用......它仍在输出每一行。而且我已经尝试过切换不是这样的位置,这会更具意义,但它并没有用代码改变任何东西。非常感谢任何帮助:)

4 个答案:

答案 0 :(得分:13)

问题不在于你使用notor并不代表你的想法(如果你认为它是这样的话) 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):