首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >测试我是否有权限在Python3中的路径下创建文件夹?

测试我是否有权限在Python3中的路径下创建文件夹?
EN

Stack Overflow用户
提问于 2018-07-10 21:16:48
回答 1查看 1.4K关注 0票数 2

我正在使用tkinter用python3创建一个应用程序。我的应用程序从物理设备收集数据,并需要将其存储在硬盘上。该程序允许用户指定他们想要存储数据的目录。这是通过来自tkinter.filedialogaskdirectory完成的。

选择目录后,我需要检查该目录是否“有效”。如果软件具有在指定目录中创建具有任意名称的新目录的权限,则该目录有效。这就是我被卡住的地方。

我在网上读到我可以使用os.access(path, perm),并检查path上的权限。以下是在python 3.7.0中使用不具有管理员权限的标准用户的结果示例:

代码语言:javascript
复制
>>> os.access("C:\Program Files\Android", os.W_OK | os.X_OK)
True
>>> os.access("C:\Program Files\kjkjieikjd", os.W_OK | os.X_OK)
False
>>> os.access("C:\Program Files", os.W_OK | os.X_OK)
True

这不是我想要的结果,因为如果给定的目录可以创建或已经存在,则返回True,否则返回False。相反,如果我可以在给定的目录内创建任意目录,我需要它返回True。在上面的示例中,它们都应该返回False,因为标准用户在没有管理员授权的情况下不能在program files中创建文件夹。

我还读到,我可以尝试创建一个文件夹,并使用os.makedirs测试异常。这种方法也不起作用,因为任何任意目录都可以包含任意子目录,并且当目录已经存在时,os.makedirs会引发异常。在这种情况下,我将不得不生成随机的目录名,并等待,直到我成功地创建了文件夹,或者我得到了一个不是FileExistsError的异常,这不是很好。

这两种方法都依赖于创建特定目录的想法,但在我的示例中,我需要能够创建任意目录。

如何在Python 3.7.0中检查是否有权限在给定路径下创建任意目录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 06:09:57

有很多因素(除了目录权限)会阻止您在自定义位置创建文件夹和文件。例如:

  • 父目录是可写的,但具有不可写的子目录(具有您想要使用的名称)
  • disk space is

中断访问系统目录

诸若此类。还要注意:所有这些因素(包括目录权限)都可能在您成功检查目录之后、实际写入数据之前发生变化。

这就是为什么我强烈建议使用EAFP (“请求原谅比请求许可更容易”)的方法:

  1. 尝试在出现异常时转储您的data
  2. -处理它(并可选择删除已创建的文件和文件夹)

Nevertheless,如果您确实需要预先检查目录路径,可以使用tempfile.mkdtemp来测试是否可以在指定路径下创建任何目录:

代码语言:javascript
复制
def validate_path(path):
    try:
        os.makedirs(path, exist_ok=True)
        temp_dir_path = tempfile.mkdtemp(dir=path)
        os.rmdir(temp_dir_path)
        return True
    except OSError:
        return False

或者(正如@Martijn提议的那样)使用tempfile.TemporaryDirectory作为上下文管理器的更短的等效变体:

代码语言:javascript
复制
def validate_path(path):
    try:
        os.makedirs(path, exist_ok=True)
        with tempfile.TemporaryDirectory(dir=path):
            return True
    except OSError:
        return False

注1:os.makedirs是必须的,否则如果path不存在,创建临时目录会失败。

注意2:如果你使用的是PYTHON3.3版本,你应该捕获的不是OSError而是EnvironmentError

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51266312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档