2011-06-21 89 views
1

elif stament應該打印在我進行的搜索中找不到的日誌文件和路徑。但是,它們產生在單個文件中搜索的每一行(大量信息)。我究竟做錯了什麼?有條件的elif語句不會產生正確的結果

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!!!" 
+8

你爲什麼使用'elif'?一個簡單的'else'就足夠了。 –

+1

在'elif'塊中(即如果'result'是False-ish),調用'result.group()'應該引發一個異常。 – unutbu

+0

所以它永遠不會進入'elif'部分?你能顯示你使用的正則表達式和一個文件內容的樣本嗎? @unutbu:是的,但它似乎並沒有去那裏。 – phant0m

回答

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() 
+0

我的微弱嘗試是在不同的.txt和.log文件中搜索並匹配用戶輸入的字符串,並打印找到該字符串的文件和行號。另外,我想打印未找到/匹配字符串的文件。這似乎很簡單,但我只是碰到各種各樣的牆壁。當你對語言(Python)及其構造的瞭解有限時,很難 – suffa

+0

@user,這沒問題。其實我說的一部分是錯誤的...更新即將到來。 – senderle

+0

@user,看看我的更新 - 它應該可以解決你的問題 – senderle

相關問題