22

有重新创建文件夹的脚本:

# Remove folder (if exists) with all files
if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")):
        shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True)
# Create new folder
os.mkdir(os.path.realpath('..') + "\\my_folder")

这几乎总是有效,但在某些情况下(在创建步骤)我得到

WindowsError: [Error 5] Access is denied: 'C:\\Path\\To\\my_folder'

什么可能导致此错误,我该如何避免它?

4

7 回答 7

13

请参阅 RemoveDirectory 文档;“RemoveDirectory 函数在关闭时标记要删除的目录。因此,在关闭该目录的最后一个句柄之前,不会删除该目录。”

这意味着,如果某些东西设法为您删除的目录创建了句柄(在创建和删除之间),那么该目录实际上并没有被删除,您会得到“拒绝访问”,

要解决此问题,请在删除之前重命名要删除的目录。

所以

while True:
  mkdir('folder 1')
  rmdir('folder 1')

可以失败,解决;

while True:
  mkdir('folder 1')
  new_name = str(uuid4())
  rename('folder 1', new_name)
  rmdir(new_name)
于 2017-08-15T07:35:01.183 回答
9

权限可能是问题,但我在 a 上遇到了同样的问题“[错误 5] 访问被拒绝”,os.rename()并且一个简单的重试循环能够在重试几次后重命名文件。

for retry in range(100):
    try:
        os.rename(src_name,dest_name)
        break
    except:
        print "rename failed, retrying..."
于 2017-03-27T12:39:26.750 回答
7

什么可能导致此错误?

您根本无法访问您正在为当前正在运行的进程(python.exe)甚至用户编写的文件夹。除非您的用户是管理员,否则可能存在您没有写入权限的目录。


我怎样才能避免它?

一般来说,为了避免这种异常,人们会使用 atryexcept块,在这种情况下它将是一个IOError. 因此,如果您只想忽略拒绝访问并继续执行脚本,您可以尝试:

try:
    # Remove folder (if exists) with all files
    if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")):
        shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True)
    # Create new folder
    os.mkdir(os.path.realpath('..') + "\\my_folder")
except IOError:
    print("Error upon either deleting or creating the directory or files.")
else:
    print("Actions if file access was succesfull")
finally:
    print("This will be executed even if an exception of IOError was encountered")

如果您真的没有预料到这个错误并且它不应该发生,您必须更改文件的权限。根据您的用户权限,您可以采取各种步骤。

  • 可以以管理员身份执行程序的用户: 选项 A

    1. 右键单击cmd.exe
    2. 单击以管理员身份运行
    3. 转到您的脚本位置,因为除非您编辑某些参数,否则cd它将打开。C:\Windows\system32
    4. 运行你的脚本> python myscript.py
  • 可以以管理员身份执行程序的用户: 选项 B

    1. 打开文件资源管理器。
    2. 转到您要写入的文件夹或文件夹。
    3. 右键单击它。
    4. 选择属性。
    5. 在属性窗口中选择安全选项卡。
    6. 单击编辑并根据需要或需要对其进行编辑,以授予程序或用户访问权限。
  • 没有管理员权限的用户:

    1. 这可能意味着它不是您的计算机。
    2. 如果在 Uni 或 Work,请查看 PC 帮助台,如果在学校,请询问您的老师。
    3. 如果您在家并且是您的计算机,则意味着您已使用非管理员用户登录。您创建的第一个通常是默认设置。如果是,请检查控制面板中的用户设置。
    4. 从那里开始,之后的其余部分几乎相同。
于 2016-06-15T09:37:13.447 回答
3

对我来说,它以这种方式工作:

while os.path.isdir (your_path):
    shutil.rmtree (your_path, ignore_errors=True)
os.makedirs (your_path)
于 2019-03-13T01:05:36.253 回答
1

我昨晚在将 Py2 切换到 Py3 后遇到了这个问题,并意识到我正在为所有用户安装它。这意味着您将它安装到Program Files目录而不是%AppData%。大多数情况下,以管理员身份运行可以解决上述问题,但我使用 VSCode,有时使用 PyCharm,并且喜欢在其中使用终端。即使您尝试以管理员身份运行这些程序,在尝试专注于您可爱的代码时也会有很多烦人的时间。

我的解决方案:
1)完全卸载(包括Py Launcher
2)然后使用提供的安装程序进行自定义安装,但是......
3)不要选择为所有用户安装选项。

我认为这将使您的一天更加轻松,因为它对我有用,所以在您的命令提示符处没有任何“[错误 5]”行。

于 2018-06-17T22:54:20.817 回答
1

创建你的 python 脚本文件。在这种情况下,您可以将其复制到 C:\WINDOWS\system32 中。脚本文件正在创建一个名为“Smaog”的文件夹

import os
os.chdir('C:/Program Files')
os.makedirs('Smaog')

在您喜欢的任何文件夹中创建批处理文件。

echo off
title Renaming Folder
python sample.py
pause

保存批处理文件。要运行它,请右键单击并选择以管理员身份运行

如果您不想将 python 脚本放在 C:\WINDOWS\system32 中,则可以选择这样做。在您的批处理文件中,指明您的 python 脚本文件所在的文件夹/目录。

echo off
title Renaming Folder
cd c:\Users\Smaog\Desktop
python sample.py
pause

然后按照上面的说明以管理员身份运行它。

于 2018-02-06T13:13:01.740 回答
1

发生这种情况是因为您没有检查您是否有权打开该路径。您需要更改这些文件夹的权限。

于 2016-06-15T08:53:15.477 回答