2016-04-29 119 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'來捕獲它。 –