чтение - редактирование файла python




«Open()» Python генерирует разные ошибки для «файла не найден»-как обрабатывать оба исключения? (3)

В 3.3 IOError стал псевдонимом для OSError , а FileNotFoundError является подклассом OSError . Таким образом, вы можете попробовать

except (OSError, IOError) as e:
   ...

Это приведет к довольно широкой сети, и вы не можете предположить, что исключение - «файл не найден», не e.errno , но он может охватывать ваш прецедент.

PEP 3151 обсуждает обоснование изменений в деталях.

У меня есть сценарий, в котором пользователю предлагается ввести имя файла (файла, который должен быть открыт), и если файл не существует в текущем каталоге, пользователь будет запрошен снова. Вот короткая версия:

file = input("Type filename: ")

...
try:
    fileContent = open(filename, "r")
    ...
except FileNotFoundError:
    ...

Когда я тестировал свой сценарий на моем MacOS X в Python 3.3x, он отлично работал, когда я неправильно печатал неправильное имя файла (он выполняет пакет под «ожидать»).

Однако, когда я хотел запустить свой код на компьютере под управлением Windows в Python 3.2x, я получаю сообщение об ошибке «FileNotFoundError» не определено. Итак, Python 3.2 в Windows считает, что «FileNotFoundError» - это переменная, и программы завершаются с ошибкой.

Я понял, что Python 3.2 на Windows бросает «IOError», если входное имя файла недопустимо. Я тестировал его на своей Linux-машине в Python 2.7, а также IOError.

Моя проблема заключается в том, что код с

except "FileNotFoundError":

не будет работать на Windows Python 3.2, но если я изменю его на

except "IOError":

он больше не будет работать на моем Mac.

Как я могу обойти это? Единственный способ, о котором я могу думать, это использовать только except , которого я обычно не хочу.


Чтобы точно поймать только тогда, когда файл не найден, я делаю:

import errno
try:
   open(filename, 'r')
except (OSError, IOError) as e: # FileNotFoundError does not exist on Python < 3.3
   if getattr(e, 'errno', 0) == errno.ENOENT:
      ... # file not found
   raise

вы можете одновременно поймать 2 ошибки

except (FileNotFoundError, IOError):

Я не понимал, что вы спрашиваете. Я надеюсь, что есть более красноречивое решение, чтобы вручную проверить

try:
   error_to_catch = FileNotFoundError
except NameError:
   error_to_catch = IOError

except error_to_catch

cwallenpoole делает это условно более красноречиво в своем ответе (error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))





ioerror