检查是否可以使用Python将文件写入目录

检查是否可以使用Python将文件写入目录,python,exception,file-access,Python,Exception,File Access,我需要检查是否可以将文件写入用户用Python指向的目录 有没有办法提前检查?我可能在用try。。为了达到这个目的,我希望有更好的东西,我可以提前检查 python方法是访问它,并在异常失败时捕获异常 如果您确实需要检查,请使用os.access,但结果并不总是正确的,例如,请注意Vista/Win7和UAC中的问题 例如: os.access(r'C:\Programme', os.R_OK) 这将告诉您是否具有读取权限。您可能找不到更好或更具python风格的内容。Python的哲学是 如

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


有没有办法提前检查?我可能在用try。。为了达到这个目的,我希望有更好的东西,我可以提前检查

python方法是访问它,并在异常失败时捕获异常

如果您确实需要检查,请使用os.access,但结果并不总是正确的,例如,请注意Vista/Win7和UAC中的问题

例如:

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

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

您可能找不到更好或更具python风格的内容。Python的哲学是


如果你愿意,你可以用。再加上检查您是否有文件而不是目录。它可能会给你你所需要的。异常路径要好得多。

尽管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调用之间将感兴趣的文件从操作系统或磁盘缓存中逐出。在这种情况下,您将经历一次严重的减速,因为您必须两次使用磁盘(现在,这也意味着使用网络)。

为什么您希望使用更好的磁盘?在Python和标准的错误处理方式中,异常是廉价的。@Jim:谢谢你的评论,我对这篇文章做了一点详细的阐述。在Python中,异常并不廉价,但更多细节请参见我的答案——特别是,os.access和stat仍然不能给你带来真正的安全,实际上为竞争条件创造了机会。尽管如此,他们仍然可以改善用户体验。@S.Lott:我修改了带有“危险”一词的句子。“更好”是什么意思?您的用户权限定义什么是允许的,什么是不允许的。您可以尝试编写一个奇特的if语句,看看有效的用户是否能够执行该操作——有效地复制操作系统正在执行的操作。或者,您也可以尝试一下并处理异常,将责任分配给操作系统进行检查。您正在尝试复制操作系统权限检查吗?为什么要麻烦?捕捉错误有什么错?-1重申Python哲学,但没有讨论为什么异常处理是这里更好的解决方案。@Joe:我链接到Python哲学。此外,它也是一种哲学,因为它在Python中适用于这里和其他地方。例如,它对duck类型很有用;事实上,它形容它“干净又快”,我强烈反对这两种说法。@Joe:我同意它不快。我认为这是干净的。更重要的是,EAFP从一个不同的角度来解决这个问题。您的答案是“因为竞争条件”,这是正确的,但对编程语言来说是不变的。我的答案是“使用EAFP”,因为它对Python中的所有事情都很有用,而不仅仅是因为竞争条件。OP可能会发现这两个答案在不同方面都很有用。