Несмотря на утверждение Джима Бриссома, обработка исключений в Python стоит не дешевле по сравнению с идиомами «проверяй и пробуй», если вы ожидаете, что это не удастся более чем в несколько процентов времени. (Прочитайте до конца об исключении!) Тем не менее, ключевым моментом здесь является то, что вам все равно нужно проверить исключение, потому что разрешения могут меняться между проверкой и вашей записью:
### !!! This is an example of what not to do!
### !!! Don't do this!
if os.access("test", os.W_OK):
# And in here, some jerk does chmod 000 test
open("test", "w").write(my_data)
# Exception happens despite os.access!
os.access и модуль stat хороши, если вы пытаетесь, например, подготовить список папок, которые пользователь может выбрать, и хотите исключить недействительные априори. Однако, когда резина отправляется в путь, она не заменяет обработку исключений, если вы хотите, чтобы ваша программа была надежной.
А теперь исключение из правила «исключительные ситуации - медленные»: исключения являются медленными, а диски - медленнее. И если ваш диск находится под особенно большой нагрузкой, вы можете в конечном итоге получить файл, который вас интересует, из операционной системы или дискового кэша между os.access и open call. В этом случае вы будете испытывать значительное замедление, поскольку вам придется дважды переходить на диск (а в наши дни это может означать и сеть).