web-dev-qa-db-ja.com

Pythonでファイルが読み取り可能かどうかを確認します:tryまたはif / else?

私は次のコードを持っています:

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

しかし、これが正しい方法であるかどうかはよくわかりません。 trycatchのエラーを使用する方が良いですか?もしそうなら、どうすればtryが読みやすくなりますか? elseステートメントのbreakに注意してください。ファイルが読み取れないとすぐに、ループを中止します。

20
Bram Vanroy

私にとっては、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
12
Robᵩ

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)
22
Tagar

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

そうすれば、二重チェックや競合状態も回避できます。

5
bereal
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

これは通常私がすることです。堅牢で簡単です

1
user126885