私は次のコードを持っています:
import glob, os
for file in glob.glob("\\*.txt"):
if os.access(file, os.R_OK):
# Do something
else:
if not os.access(file, os.R_OK):
print(file, "is not readable")
else:
print("Something went wrong with file/dir", file)
break
しかし、これが正しい方法であるかどうかはよくわかりません。 try
とcatch
のエラーを使用する方が良いですか?もしそうなら、どうすればtryが読みやすくなりますか? elseステートメントのbreak
に注意してください。ファイルが読み取れないとすぐに、ループを中止します。
私にとっては、if-elseを使用するのと同じスコープでtry-exceptを使用しても読みにくくなります。例外の価値は、コールツリーの上位レベルでキャッチできることです。
1レベルだけ移動すると、break
ステートメントは回避されます。
import glob, os
try:
for file in glob.glob("\\*.txt"):
with open(file) as fp:
# do something with file
except IOError:
print("could not read", file)
しかし、例外の真の天才は、コードが単に消えるときです:
# Operate on several files
# SUCCESS: Returns None
# FAIL: Raises exception
def do_some_files():
for file in glob.glob("\\*.txt"):
with open(file) as fp:
# do something with file
現在は、失敗したときに有用なエラーメッセージを表示するのは呼び出し側プログラムの責任です。このコードから完全に他の領域に障害を処理する責任を削除しました。
実際、責任をプログラムから完全に解釈者に移すことができます。その場合、インタープリターはいくつかの有用なエラーメッセージを出力し、プログラムを終了します。 Pythonのデフォルトメッセージがユーザーにとって十分であれば、エラーをチェックしないことをお勧めしますat)。したがって、元のスクリプトは次のようになります。
import glob, os
for file in glob.glob("\\*.txt"):
# Do something
file
が実際にはファイルであり、ディレクトリではなく、読み取り可能であるかどうかを確認するより明示的な方法:
from os import access, R_OK
from os.path import isfile
file = "/some/path/to/file"
assert isfile(file) and access(file, R_OK), \
"File {} doesn't exist or isn't readable".format(file)
Python culture、より一般的には 許可ではなく許しを求めてください なので、例外をキャッチすることが望ましいです:
for filename in glob.glob('*.txt'):
try:
with open(filename) as fp:
# work with the file
except IOError as err:
print "Error reading the file {0}: {1}".format(filename, err)
break
そうすれば、二重チェックや競合状態も回避できます。
try:
# check to see if file is readable
with open(filename) as tempFile:
except Exception as e:
print e
# here you can modify the error message to your liking
これは通常私がすることです。堅牢で簡単です