2011-06-17 67 views
0

有人可以向我解釋爲什麼我的條件搜索語句返回兩個結果(它找到字符串並將結果打印到屏幕上並打印「未找到字符串」)。我已經做出了改變,但我必須忽略一些東西。搜索打印結果和「未找到字符串」條件

代碼:

if choice == '1': 
     regex2 = re.compile(r'\s+') 
     for root,dirname, files in os.walk(directory): 
      for file2 in files: 
       if file2.endswith(".log") or file2.endswith(".txt"): 
        f=open(os.path.join(root, file2)) 
        for i,line in enumerate(f.readlines()): 
         result2 = regex.search(re.sub(regex2, '',line)) 
         if result2: 
          ln = str(i) 
          print "\nLine: " + ln 
          print "File: " + os.path.join(root,file2) 
          print "String Type: " + result2.group() + '\n' 
          temp.write('\nLine:' + ln + '\nString:' + result2.group() + '\nFile: ' + os.path.join(root,file2) + '\n') 

        else: 
         print "String not found!!!" 
        break 
        f.close()  
     re.purge() 
+0

我認爲你需要縮進你'else'上一級 – inspectorG4dget

回答

1

如果由於循環遍歷的循環耗盡而退出循環,而不是歸因於break語句,則會執行到for循環的else子句。由於您的循環不包含任何break,因此將始終執行else子句。

這是試圖重構你的代碼。它使用生成器函數來生成文件名列表和fileinput模塊,以負責打開和關閉文件。你的鱈魚從來沒有明確地關閉任何文件,因爲f.close()之前立即使用break

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) 
3

你有一個缺口的問題,我想你想:

... 
for i,line in enumerate(f.readlines()): 
    result2 = regex.search(re.sub(regex2, '',line)) 
    if result2: 
     ln = str(i) 
     print "\nLine: " + ln 
     print "File: " + os.path.join(root,file2) 
     print "String Type: " + result2.group() + '\n' 
     temp.write('\nLine:' + ln + '\nString:' + result2.group() + '\nFile: ' + os.path.join(root,file2) + '\n') 

    else: # <<<<<<<<<<<<<<<<<<<< HERE !!!! 
     print "String not found!!!" 
break 
... 
+0

我從缺口的角度來看,看起來知道對不對,而是因爲它在for循環會自動默認爲「字符串未找到」線進入無限循環。 – suffa

+0

@user:對不起,但是你的意思是「進入一個無限循環」?你想要做什麼?所以我可以嘗試幫助更多:) – mouad

1

請重構代碼一點 - 有太多的縮進和混合控制結構。以這種方式來發現和糾正問題會更容易。

例如 - 拆分成循環遍歷和檢查:

def look_through(directory): 
    found = 0 
    for root, dirname, files in os.walk(directory): 
     for filename in files: 
      result = process_file(root, filename) 
      if result is not None: 
       found += 1 
       yield result 
    if found == 0: 
     print 'blah, not found' 

def process_file(... 

你看到現在前面的代碼的問題?任何條件只能檢查每個文件,然後再檢查每個目錄。沒有結果的全球計數器,或記錄的搜索狀態。

+0

是的,我願意!謝謝! – suffa

相關問題