我需要检查是否可以使用Python将文件写入用户指定的目录。
有没有一种方法可以提前检查呢?我可能会使用try...catch来达到这个目的,但我希望有更好的方法可以事先检查。
我需要检查是否可以使用Python将文件写入用户指定的目录。
有没有一种方法可以提前检查呢?我可能会使用try...catch来达到这个目的,但我希望有更好的方法可以事先检查。
尽管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和打开调用之间被操作系统或磁盘高速缓存中删除的情况。这种情况下,你将会遇到很大的减速,因为你需要两次访问磁盘(现在可能还包括网络)。
您可能找不到比这更好或更符合Python风格的东西了。Python的哲学是宁愿请求原谅,也不要事先获得许可。
如果您喜欢,可以使用os.access。结合os.path.isfile来检查您是否拥有文件而不是例如目录。这很可能会给您所需的内容。异常路径更好。
Pythonic的方式是去访问它,如果失败则捕获异常。
如果你真的需要检查它,可以使用os.access
,但结果并不总是正确的,请注意在Vista/Win7中可能会出现UAC问题!
示例:
os.access(r'C:\Programme', os.R_OK)
只需使用这个:
def check_access(file, mode):
try:
open(file, mode)
return True
except PermissionError:
return False
print(check_access("test", "w"))
如果没有权限,将输出以下内容:
False
如果有权限,则输出:
True
如果您使用os.access()
,那么您有可能会得到类似以下的内容:
Traceback (most recent call last):
File "/Users/lawrence/Library/Application Support/CodeRunner/Unsaved/Untitled.py", line 8, in <module>
open("test", "w").write("test")
PermissionError: [Errno 13] Permission denied: 'test'
你仍然可以使用os.access()
,但我不建议这样做