Проверьте, читается ли файл с помощью 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

Но я не совсем уверен, правильно ли это сделать. Лучше ли использовать try и catch ошибку? Если да, то как я могу попытаться читать? Обратите внимание на break в инструкции my else. Как только файл не может быть прочитан, я хочу прервать цикл.

Ответ 1

Для меня, используя try-except, в той же области действия, что и if-else, не имеет никакой удобочитаемости. Значение исключений состоит в том, что их можно поймать на более высоком уровне в дереве вызовов.

Переходя только на один уровень, мы избегаем инструкции 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 достаточно для ваших пользователей, я рекомендую вообще не проверять наличие ошибок. Таким образом, ваш оригинальный script будет выглядеть следующим образом:

import glob, os
for file in glob.glob("\\*.txt"):
    # Do something

Ответ 2

Более явный способ проверить, действительно ли 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)

Ответ 3

В культуре Python чаще просить прощения, а не разрешения, поэтому желательно ловить исключение:

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

Таким образом, вы также избежите любых двойных проверок или условий гонки.

Ответ 4

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

Это обычно то, что я делаю. Он прочный и прямой