4

問題:

ファイルを探して開くコードがあります。デフォルトでは、#######(各 # は数字) で始まるファイルを探します。

問題は、ファイル名が である場合と、 である場合があり##-#####ます#####

ファイルが見つからない場合は、ファイルを書き込むことができる他の 2 つの方法を探してみてください。

ファイルが見つからない場合、IOError 例外が発生します。私が考えていたのは、次のようなexceptステートメントを持つことでした:

except File2:
    Look for ##### in  myfindFileFunction()
    if file is still not found run except File3
except File3:
    Look for ##-#### in myfindFileFuction()
except:
    print "File not found"

私が確信していないのは、このように動作するようにカスタム例外を設定する方法、および/またはこれを完全に行うためのよりPythonicな方法があるかどうかです...

パターンまたは 3 つの可能なファイル名を設定し、ファイルが見つかるまでそれぞれを反復する方がうまくいくでしょうか?

4

3 に答える 3

5

実際、try/except の使用は非常に Pythonic (かつ高速) な方法です。

それがPythonicであるかどうかだけでなく、そのアプローチが読みやすさの点でどのような影響を与えるかを検討する必要があります。6 か月後にもう一度見たときに、コードをすぐに理解できますか? 他の誰かがしますか?

私は通常、この種のことを処理するための少し複雑な try/except 句が十分にコメントされていることを確認します。それは別として... それは完全に合理的な方法です。

また、パフォーマンスに関して安心するために、2 つのアプローチのどちらかを決定する際の一般的な懸念事項として、Python の if と try-exceptを参照してください。Python では、try/except 構造が高速であることがわかります...本当に速い。

于 2012-07-25T16:41:40.197 に答える
3

カスタム例外は不要

import errno

try:
    open('somefile')
except IOError as e:
    if e.errno == errno.ENOENT:
        open('someotherfilename')
    else:
        raise e

(これは *nix にあります。Windows を使用しているかどうかはわかりません)

于 2012-07-25T16:43:45.743 に答える
1

独自の例外を定義するのは簡単です。Exceptionから派生したクラスを作成するだけです。ドコは明確です。

ただし、ファイルタイプごとに個別の例外を作成したり、例外を作成したりする必要はないようです。あなたは次のようなことをすることができます:

ファイル=('#######'、 "##-#####'、' #####')

fh=なし
ファイル内のfの場合:
    試す:
        fh = open(f)
        壊す
    eとしてのIOErrorを除く:
        e.errno in(errno.ENOENT、)の場合:
            パス
        そうしないと:
            高める

fhでない場合:
    ##3回すべての試行が失敗しました

ifaroundを使用e.errnoすると、どのIOエラーが次のファイルに進むことを意味し、どのIOエラーについて知りたいかを判断できます。ファイルが存在しません(errno.ENOENT)は、次のファイルを試すことを意味します。しかし、「開いているファイルが多すぎます」(errno.ENFILE)のような他のものは、おそらく別の応答が必要です。

于 2012-07-25T17:17:14.493 に答える