2016-08-17 5 views
1

複数のファイルの有無を確認する必要があります。それを行う最も効率的な方法はどれですか?実行し、手の前に許可を求めるよりも、許しを求める -`open(fname、 'r')。close()`と `os.path.isfile(fname)`の相違点

list_of_files = [fname1,fname2,fname3] 
for fname in list_of_files: 
    try: 
     open(fname, 'r').close() 
    except IOError: 
     raise YourCustomError 

または

list_of_files = [fname1,fname2,fname3] 
for fname in list_of_files: 
    if not ps.path.isfile(fname): 
     raise YourCustomError 
+1

'os.access()'についてはどうですか? https://docs.python.org/2/library/os.html#os.access –

答えて

1

共通理念があります。

最初の方法では、ファイルを読み取り可能なモードで開こうとしますが、ファイルが存在しないか読み取り不能な場合は失敗します。ここでは、操作が失敗した後の許しを求めています。

2番目のアプローチでは、最初に許可を求めるだけです。 2番目の例では、ファイルであるかどうかを確認し、許可を確認しません。

しかし、手動でファイルハンドラを閉じる代わりに、コンテキストマネージャ(with open(filename, "r"))を使用する方がはるかに良い方法かもしれません。

1

複数のファイルの有無を確認する必要があります。それを行う最も効率的な方法はどれですか?

あなたの2つのアプローチが同じことをしないので、効率の問題だけではありません。ファイルは許可のためにexist and be unreadable to youと言うかもしれません。あなたの最初のアプローチは、ファイルがオープンで可読であるかどうかを実際にチェックする唯一のアプローチです(少なくとも両方のアプローチに競合条件がある場合)。

2

を使用する場合は、を使用すると、ではありません。あなたの呼び出しとそのファイルを使用するときにファイルが削除されたり、アクセス権が変更されたりして、その情報が廃止される可能性があります。代わりに、単にファイルを使用しようとそこに例外を処理:

try: 
    with open(fname, 'r') as f: 
     # use f 
except FileNotFoundError as e: 
    # file was deleted 
except IsADirectoryError as e: 
    # path exists but is a directory 
except PermissionError as e: 
    # you don't have permissions to read the file 
except OSError as e: 
    # other error 

ユーザーへの権限に関する情報を表示しているツールを書いているが、それはのために提供される方法および機能を使用することは理にかなっている場合具体的にはこの目的のためにos.path.existsos.is_fileos.is_dirを使用してください。

ディレクトリ全体を扱っている場合は、os.scandirを使用し、DirEntryオブジェクトのメソッドを確認する方が効率的です。

関連する問題