根据 os 模块的官方文档, IsADirectoryError 是在目录上使用 os.remove() 时引发的异常。
我希望以下代码可以创建和删除目录,但它会出错:
>>> os.mkdir(r'C:\test')
>>> try:
... os.remove(r'C:\test')
... except IsADirectoryError:
... os.rmdir(r'C:\test')
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
PermissionError: [WinError 5] Access is denied: 'C:\\test'
为什么我收到权限错误而不是预期的 IsADirectoryError?
编辑:只需运行 os.rmdir(r'C:\test') 即可,因此我的脚本确实有权删除该文件夹。
编辑:有人建议我捕获 WinError 5 并尝试将其作为文件夹处理,如果这不起作用,则继续处理 WinError 5 的其他错误可能性。如下所示,这可以快速创建丑陋的代码。有没有办法区分引发 WinError 5 异常的不同错误?如果没有,是否有更简洁的方法来处理所有可能的情况?
try:
os.remove(r'C:\test')
except WindowsError as e:
if e.winerror==5: #maybe it's a directory
try:
os.rmdir(r'C:\test')
except WindowsError as f:
if f.winerror==5: #maybe it's read-only
try:
os.chmod(r'C:\test', 0o777)
except WindowsError as g:
if f.winerror==5: #maybe we don't have access
...
最佳答案
文档(https://docs.python.org/3.8/library/exceptions.html)说 IsADirectoryError 对应于 errno=EISDIR,因此如果操作系统返回 EISDIR,则会引发此问题。 Windows,当使用 os.remove 删除目录时会引发 WindowsError ,因为 Python 不会从操作系统获取 EISDIR 作为响应,而是其他东西。这可以简单地处理:
try:
os.remove(r'C:\test')
except WindowsError as e:
if e.winerror == 5: # maybe we tried to remove a directory, so
os.rmdir(r'C:\test')
else:
raise # we just re-raise whatever the exception was.
关于python - 权限错误 : [WinError 5] instead of IsADirectoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59399649/