Проверьте, могу ли я записать файл в каталог или нет с помощью Python - PullRequest
9 голосов
/ 12 сентября 2010

Мне нужно проверить, могу ли я записать файл в каталог, на который пользователь указывает с помощью Python.

Есть ли способ проверить это заранее?Я могу использовать для этого попытку ... ловить, но ожидаю чего-то лучшего в том смысле, что могу проверить заранее.

Ответы [ 3 ]

11 голосов
/ 12 сентября 2010

Несмотря на утверждение Джима Бриссома, обработка исключений в 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. В этом случае вы будете испытывать значительное замедление, поскольку вам придется дважды переходить на диск (а в наши дни это может означать и сеть).

4 голосов
/ 12 сентября 2010

Вы, вероятно, не найдете что-то лучшее или более Pythonic. Философия Python - , просить прощения легче, чем разрешение .

Вы можете использовать os.access , если хотите. В сочетании с os.path.isfile , чтобы проверить, есть ли у вас файл, а не, например. каталог. вероятно даст вам то, что вам нужно. Путь исключения намного лучше.

1 голос
/ 12 сентября 2010

Питонный способ - получить к нему доступ и поймать исключение в случае сбоя.

Если вам действительно нужно это проверить, используйте os.access, но результаты не всегда верны, остерегайтесь проблем в Vista/ Win7 с UAC, например!

Пример:

os.access(r'C:\Programme', os.R_OK)

Это сообщит вам, если у вас есть доступ для чтения.

...