Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 测试我是否有权限在Python3中的路径处创建文件夹?_Python 3.x_Permissions - Fatal编程技术网

Python 3.x 测试我是否有权限在Python3中的路径处创建文件夹?

Python 3.x 测试我是否有权限在Python3中的路径处创建文件夹?,python-3.x,permissions,Python 3.x,Permissions,我正在使用tkinter用Python3创建一个应用程序。我的应用程序从物理设备收集数据,并需要将其存储在硬盘上。 该程序允许用户指定一个目录,用于存储数据。这是通过tkinter.filedialog中的askdirectory完成的 选择目录后,我需要检查目录是否有效。如果软件有权在指定目录中创建具有任意名称的新目录,则目录有效。这就是我被卡住的地方。 我在互联网上读到,我可以使用os.access(path,perm)并检查path的权限。以下是在python 3.7.0中使用没有管理员权

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

选择目录后,我需要检查目录是否有效。如果软件有权在指定目录中创建具有任意名称的新目录,则目录有效。这就是我被卡住的地方。
我在互联网上读到,我可以使用
os.access(path,perm)
并检查path的权限。以下是在python 3.7.0中使用没有管理员权限的标准用户的结果示例:

>>> 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,因为没有管理员授权,标准用户无法在
程序文件
中创建文件夹

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

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

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

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

  • 父目录是可写的,但其子目录(具有您想要使用的名称)是不可写的
  • 磁盘空间不足
  • 中断访问系统目录
等等。还要注意:所有这些因素(包括目录权限)都可能在您成功检查目录后,但在您实际写入数据之前发生变化

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

  • 尝试转储数据
  • 如果出现异常-处理它(并可以选择删除已创建的文件和文件夹)
  • 尽管如此,如果确实需要预先检查目录路径,可以使用来测试是否可以在指定路径上创建任何目录:

    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 Pieters所建议的)一个稍微短一点的等效变体,用作上下文管理器:

    def validate_path(path):
        try:
            os.makedirs(path, exist_ok=True)
            with tempfile.TemporaryDirectory(dir=path):
                return True
        except OSError:
            return False
    
    注1:is nessery,否则如果
    path
    不存在,则创建临时目录将失败


    注2:如果您使用低于3.3的Python,则不应捕获OSError,而应捕获。

    谢谢您的回答。我尝试了您的代码示例,但它似乎卡在了第4行
    temp\u dir\u path=tempfile.mkdtemp(dir=path)
    。当我提供有效路径时,它可以正常工作,但当我提供无效路径时,脚本会暂停。您可以对tempfile.TemporaryDirectory(dir=path)使用
    :返回True
    ,此时您不必担心遥控器会再次出现。@MartijnPieters您是对的,谢谢,我已更新了答案。在Windows上使用tempfile检查权限时,请注意Python中的此错误: