判断目录是否可写

134 投票
12 回答
99720 浏览
提问于 2025-04-15 18:20

在Python中,怎么才能判断一个文件夹对执行脚本的用户来说是否可以写入呢?因为这可能需要用到os模块,所以我得提一下,我是在*unix环境下运行的。

12 个回答

28

我用tempfile模块的解决方案:

import tempfile
import errno

def isWritable(path):
    try:
        testfile = tempfile.TemporaryFile(dir = path)
        testfile.close()
    except OSError as e:
        if e.errno == errno.EACCES:  # 13
            return False
        e.filename = path
        raise
    return True

更新: 在Windows上再次测试代码后,我发现使用tempfile时确实存在问题,具体可以查看issue22107: tempfile模块在Windows上错误解读访问被拒绝的错误。 如果目录是不可写的,代码会卡住几秒钟,最后抛出一个IOError: [Errno 17] 找不到可用的临时文件名的错误。也许这就是用户2171842观察到的情况? 不幸的是,这个问题目前还没有解决,所以为了处理这个情况,必须捕捉到这个错误:

    except (OSError, IOError) as e:
        if e.errno == errno.EACCES or e.errno == errno.EEXIST:  # 13, 17

当然,在这些情况下,延迟仍然存在。

85

这听起来可能有点奇怪,但在Python编程中,有一句常用的说法:

请求原谅比请求许可更容易。

根据这个说法,有人可能会建议:

试着往那个目录里写东西,如果没有权限的话,就捕捉到错误。

236

虽然Christophe建议的方法更符合Python的风格,但os模块确实有一个叫做os.access函数可以用来检查访问权限:

os.access('/path/to/folder', os.W_OK) # W_OK表示写权限,R_OK表示读权限,等等。

撰写回答