2009-12-08 20 views
0
def checkCache(cachedText): 
    for line in open("cache"): 
     if cachedText + ":" in line: 
      print line 
      open("cache").close() 
     else: 
      requestDefinition(cachedText) 

此代碼搜索的特定字符串(cachedText +「:」)的文件(緩存)的每一行。在文件中搜索字符串,並在未找到字符串時執行函數;在python

如果沒有找到特定字符串,則整個文件是指調用另一個函數(requestNewDefinition(cachedText))之內。

但是我上面的代碼爲每個不匹配的行執行函數。

一個如何搜索字符串(cachedText +「:」)的文件,如果文件在字符串中沒有找到任何地方,執行其他功能?

例緩存:

hello:world 
foo:bar 

回答

2

您的循環已損壞。你實際上正在檢查文件的每一行,併爲每一行不匹配的行執行函數。

還請注意,調用open("cache").close()將重新打開緩存文件並立即關閉它,而不關閉在for循環開始處打開的句柄。

之一來執行,你需要什麼樣的方式是使for循環的else條款的一部分。 要小心for循環中的其他部分是棘手的!

def checkCache(cachedText): 
    cache = open("cache") 
    for line in cache: 
     if cachedText + ":" in line: 
      break 
    else: 
     requestDefinition(cachedText) 
    cache.close() 

一個for循環的else部分執行在循環結束時,只有在沒有break被稱爲在循環。

+0

必須將打開的文件分配給一個變量?它是否更快 - 或只是更好的做法。 – torger 2009-12-08 08:35:31

+0

for循環中的else爲什麼很棘手? – torger 2009-12-08 08:42:04

+0

@nazarius:它允許跟蹤打開的網頁以關閉它。如果你經常調用這個函數,如果你不想耗盡系統資源,你真的應該關閉這個文件。 – 2009-12-08 08:44:17

1

像這樣:

def checkCache(cachedText): 
    for line in open("cache"): 
     if cachedText + ":" in line: 
      print line 
      break 
    else: 
     requestDefinition(cachedText) 

通知的else:是如何附接至for,而不是if。該else:時,纔會執行,如果for完成了由耗盡迭代,不執行break,這將意味着cachedText沒有在文件中隨處可見。有關更多信息,請參閱the Python documentation

1

我的猜測是你想要這樣的東西。如果找到該行,則應該「斷開」。 「break」將結束for循環。附加到for循環的else語句(與if語句相反)只會在for循環遍歷每一行時才執行,而不會觸及「break」條件。完成後您仍然希望關閉文​​件。

def checkCache(cachedText): 
    f = open("cache") 
    for line in f: 
     if cachedText + ":" in line: 
      print line 
      break 
    else: 
     requestDefinition(cachedText) 
    f.close() 
相關問題