2009-12-08 103 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()