12

我需要检查是否可以将文件写入用户使用 Python 指向的目录。

有没有办法提前检查?我可能会为此使用 try .. catch ,但我希望有更好的东西,因为我可以提前检查。

4

3 回答 3

15

尽管 Jim Brissom 声称,与“检查然后尝试”习语相比,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 调用之间的操作系统或磁盘缓存中逐出。在这种情况下,您将经历一次严重的减速,因为您必须两次访问磁盘(现在,这也可能意味着网络)。

于 2010-09-12T19:03:28.350 回答
3

您可能找不到更好或更 Pythonic 的东西。Python 的哲学是请求原谅比请求许可更容易

如果您愿意,可以使用os.access。再加上os.path.isfile来检查你是否有一个文件而不是一个目录。它可能会给你你需要的东西。异常路径要好得多。

于 2010-09-12T18:50:44.980 回答
1

pythonic 方法是访问它并在失败时捕获异常。

如果你真的必须检查它,请使用os.access,但结果并不总是正确的,例如,请注意带有 UAC 的 Vista/Win7 中的问题!

例子:

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

这将告诉您是否具有读取权限。

于 2010-09-12T18:48:52.513 回答