2016-04-29 18 views
1

ファイルを開いて値を探しています。値が存在しない場合、プログラムはエラーメッセージを表示して終了し、それ以外の場合は値を返します。ファイルが存在しない場合は、IOErrorを処理します。値が存在しない場合はここに私のコードスニペットはopen file 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() 

ですが、私はいつもどれも、私はここで何かが足りないのです推測していないてしまいますが、それを見ることはできません!任意のヒント?

#!/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 

スクリプトを

+1

「価値」とは何ですか? –

+1

Pythonは大文字と小文字を区別します: 'value'と' Value'は異なります。 – cdarke

+0

[OK]私は自分のコードでそれを修正し、実際に私は別のパラメータ名を持って私のコードで、例を示すためにここに何か他の値と値を探しています:) – Odin

答えて

2

あなたはそれが何かを見つけるしない場合StopIteration例外を発生させたnextを使用することができます。

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流れはここに役に立つかもしれない、それはあなたがループのためにそのエンド(doc)に達した場合にコードを実行することができます出力:

$ ./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

を実行します。たとえば、ファイルが存在しない場合。プログラムはログファイルを書き込み、十分に包括的でなければなりません。とにかくありがとう – Odin

1

元のスタブコードに問題があるのはなぜ価値が理解されます。

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

lineが発見された場合、これはlineを返します。しかし、lineが見つからないとどうなりますか? myfilevalueを反復した後にエラーが生成されないので、except句をトリガーしません。 findvalue()は暗黙のうちにNoneを返します。あなたが本当にその後、raise ValueErrorreturn "Value not found in file"を交換してexcept None as eを置き換えるエラーが発生する場合except None as e:ブロック

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. 

および削除:return見つからない文字列を追加します。あなたのコードにマイナーtweekは、問題を修正しますexcept ValueError as e

+0

あなたは投票をしました。それはトリックも同様です:)しかし例外を使って何かを探していました!ありがとう – Odin

+0

私の最後の段落はここで例外を使用する方法を示しています。すなわち、最初にエラーを 'raise'してから、' except'でそれを捕まえることができます。 –

関連する問題