python - 权限错误 : [WinError 5] instead of IsADirectoryError

标签 python error-handling operating-system

根据 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/

相关文章:

mysql - Apache 和 MySQL 是多线程应用程序吗?

python - 在 python 中添加带有重音的 pdf 元数据

python - 无法正确刷新 Pong 游戏中的显示

c# - “Payment.GenLedDet”因其保护级别而无法访问

c - Chromium OS 是用什么语言编写的?

bash - bash编程中有写缓冲区吗?

Python RoboBrowser 自动搜索功能

python - 将嵌入式 Python 异常传播到 C++

javascript - Node 生成过程并存储输出

java - 将文本文件中的行存储在 java 数组中