使用例は次のとおりです。
try:
with open('filename') as f:
do_stuff_that_depends_on_the_existence_of_the_file(f)
except IOError as e:
print 'Trouble opening file'
アクセス権を持ってファイルを開いている場合、OSはファイルが存在することを保証します。そうでない場合、エラーで失敗します。アクセスが排他的である場合、ファイルをめぐって競合している他のプロセスは、あなたによってブロックされるか、あなたをブロックします。
Pythonのtry
ファイルI/O APIには通常リターンコードがないため、これはファイルを開く動作のエラーまたは成功を検出するための単なる方法です(代わりに例外が使用されます)。したがって、実際にあなたの質問に答えるにtry
は、競合状態を回避するのではなく、それがopen
です。これは基本的にC(Pythonのベース)でも同じですが、例外はありません。詳細については、これをお読みください。
tryブロック内のファイルへのアクセスに依存するコードを実行することをお勧めします。ファイルを閉じると、その存在は保証されなくなります。
呼び出すと、ファイルが存在する場合と存在しない場合がある瞬間のスナップショットが得られるだけであり、一度戻っos.path.exists
たときにファイルの存在を知ることはできません。os.path.exists
悪意のあるコードまたは予期しないロジックにより、予期しないときにファイルが削除または変更される可能性があります。頭を回して、車を運転する前に道路が空いていることを確認するのと似ています。頭を後ろに向けると、もう見ていない場所で何が起こっているのかを推測する以外に何もありません。ファイルを開いたままにしておくと、運転中に(善悪を問わず)不可能な、拡張された一貫性のある状態が保証されます。:)
try/open
のスナップショットの性質のため、使用するのではなくファイルが存在しないことを確認するという提案はまだ不十分ですos.path.exists
。残念ながら、すべての場合にファイルがディレクトリに作成されるのを防ぐ方法はわかりません。そのため、ファイルが存在しないかどうかではなく、存在するかどうかを確認するのが最善だと思います。