条件elif语句没有产生正确的结果

时间:2011-06-21 17:23:14

标签: python conditional

elif stament应该打印在我执行的搜索中找不到的日志文件和路径。但是,它们会产生在单个文件中搜索的每一行(过多的信息)。我做错了什么?

 for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):
      result = regex.search(whitespace.sub('', line))
      if result:
          template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
          output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())

          print output
          temp.write(output)
          break
      elif not result:
          template = "\nLine: {0}\nString not found in File: {1}\nString Type: {2}\n\n"
          output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())

          print output
          temp.write(output)

  else:          
      print "There are no files in the directory!!!"

实际代码:

 elif searchType =='2':
      print "\nDirectory to be searched: " + directory
      print "\nFile result2.log will be created in: c:\Temp_log_files."
      paths = "c:\\Temp_log_files\\result2.log"
      temp = file(paths, "w")
      userstring = raw_input("Enter a string name to search: ")
      userStrHEX = userstring.encode('hex')
      userStrASCII = ''.join(str(ord(char)) for char in userstring)
      regex = re.compile(r"(%s|%s|%s)" % ( re.escape( userstring ), re.escape( userStrHEX ), re.escape( userStrASCII )))
      goby = raw_input("Press Enter to begin search (search ignores whitespace)!\n")


      def walk_dir(directory, extensions=""):
          for path, dirs, files in os.walk(directory):
             for name in files:
                if name.endswith(extensions):
                   yield os.path.join(path, name)

      whitespace = re.compile(r'\s+')
      for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):
          result = regex.search(whitespace.sub('', line))
          if result:
              template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
              output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())

              print output
              temp.write(output)
              #break
          elif result not in line:

              output = fileinput.filename()

              print output
              temp.write(output)
              break 

      else:          
          print "There are no files in the directory!!!"

1 个答案:

答案 0 :(得分:1)

你正在迭代传递给fileinput.input(...)的每个文件的每行,对吗?并为每一行执行if语句。如果条件为真,则为break,但如果条件为假,则不会中断,而是写入temp。因此,对于fileinput.input中与条件不匹配的每一行,您都要在temp处写一行并打印output。 (实际上,上面的内容是错误的 - 请参阅下面的编辑。)

此外,elif str(result) not in line:会产生奇怪的结果 - 只需使用其他人建议的else即可。如果在这种情况下result评估为false,则result == None,即str(result) == 'None',这意味着如果一行包含None,那么您将获得意外结果。

编辑:好的,实际上,严格来说,仔细查看您的实际代码,上述内容是错误的。但重点仍然是 - fileinput.input()返回一个FileInput对象,它实质上连接文件并依次迭代每一行。由于在某些情况下您不希望每行执行一个操作,但是每个文件都需要单独迭代它们。你可以在没有fileinput的情况下做到这一点,但既然你正在使用它,我们将坚持下去:

for filename in walk_dir(directory, (".log", ".txt")):
    for line in fileinput.input(filename):
        result = regex.search(whitespace.sub('', line))
        if result:
            template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
            output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())
            print output
            break   # (assuming you only want to print the first result)
    else:
        ouput = fileinput.filename()
        print output
        temp.write(output)
        break

其工作方式:对于列表中的每个文件,这将打印文件中的第一个匹配项,或者如果未找到匹配项则打印文件名。你可以在python中使用elsefor循环;如果循环没有被破坏,则执行循环结束时的else块。由于未找到匹配项,因此将打印文件名。

如果要在文件中打印所有匹配项,可以将匹配项保存在列表中,而不是使用else,您可以测试列表。简化示例:

matches = []
for line in fileinput.input(filename):
    if searchline(line):
        matches.append(line)
if matches:
    print template.format(matches)
else:
    print fileinput.filename()