2016-04-29 113 views
1

我想打开文件并查找值。如果该值不存在,程序将显示错误信息并退出,否则将返回该值。如果文件不存在,它将处理IOError。这里是我的代码片断尝试除了打开文件python

def findValue(value): 
    try: 
     myfile = open(file, "r") 
     try: 
      for line in myfile: 
       if value in line: 
        line = do_something 
        return line 
     finally: 
      myfile.close() 

    except IOError: 
     print "File does not exist!" 
     sys.exit() 

    except None as e: 
     print "Value not found in file" 
     sys.exit() 

当值不存在,我总是会得到无,我想我失去了一些东西,但不能看到它!有小费吗?

+1

什么是“价值”? – 2016-04-29 09:47:27

+1

Python区分大小写:'value'和'Value'是不同的。 – cdarke

+0

好吧我修正了它,因为我在我的代码中,实际上我正在寻找其他的东西,并在这里显示示例,在我的代码中它具有不同的参数名称:) – Odin

回答

2

您可以使用next这引起了一个StopIteration异常,如果它没有找到任何东西:

try: 
    with open(filename) as myfile: 
     return next(line for line in myfile 
        if value in line) 
except StopIteration: 
    print "Value not found in file" 
+0

可爱的彼得!到底在找什么。谢谢! – Odin

0

一个for...else流可能会在这里有用的,它可以让你在的情况下执行代码的for循环已经到达终点(doc):

#!/usr/bin/env python2 

def findValue(value): 
    with open('test_file', "r") as myfile: 
     for line in myfile: 
      if value in line: 
       #line = do_something 
       return line 
     else: 
      raise ValueError, "Value not found in file" 

print findValue('a') 
findValue('z') 

测试文件内容:

$ cat test_file 
abc 
def 

脚本输出:

$ ./test_script2.py 
abc 

Traceback (most recent call last): 
    File "./test_script2.py", line 16, in <module> 
    findValue('z') 
    File "./test_script2.py", line 11, in findValue 
    raise ValueError, "Value not found in file" 
ValueError: Value not found in file 

当然,如果您将'test_file'替换为非 - 现有的文件,python会引发一个IOError

+0

与尝试除了我仍然可以处理IOError。例如,如果该文件不存在。程序写入日志文件并且应该足够全面。无论如何感谢 – Odin

1

这是值得理解为什么当初存根代码有问题。

try:                    
      for line in myfile:               
       if value in line:               
        line = "found line"             
        return line 

如果line发现这将返回line。但是如果没有找到line,会发生什么情况?在迭代通过myfilevalue迭代后未发现没有错误生成,因此您不会触发except子句。您的findvalue()将隐含返回None。 A小调tweek你的代码修复该问题:添加一个未发现return字符串:

for line in myfile:               
    if value in line:               
     line = "found line"             
     return line               
return "Value not found in file" #or print this out. If you print this out rather than return a value the function will implicitly return a None. 

并取出except None as e:

如果你真的想提高一个错误,然后用raise ValueError替换return "Value not found in file",代之以except None as eexcept ValueError as e

+0

你得票,因为它也有诀窍:)但我正在寻找使用异常的东西!谢谢 – Odin

+0

我的最后一段显示了如何在这里使用异常:即首先'提出'错误,然后你可以用'except'来捕获它。 –