-2

由于某种原因,这个 python 脚本现在不再工作了。该脚本在运行后将文件夹权限更改为只读?它运行一次并删除文件夹中的所有文件,但当它再次运行时,它会收到 Windows 错误 5 访问被拒绝,因为脚本将权限更改为只读文件夹。我看不出它为什么这样做或如何避免它?

问题是我没有写这个脚本,对python一无所知。你将如何改变它以避免这个问题。请您举一个脚本中的代码示例,我不知道该放在哪里。谢谢您的帮助!

import os
import shutil

for root, dirs, files in os.walk(eg.globals.tvzip):
    for f in files:
        os.remove(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))

for root, dirs, files in os.walk(eg.globals.tvproc):
    for f in files:
        os.remove(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))
4

2 回答 2

0

如果你想删除一整棵苍蝇树,shutil.rmtree它会为你完成——你不需要遍历文件列表来删除它们。

如果您尝试不删除顶级目录,则应为此添加检查。根据文档,您将获得顶级目录:

os.walk(top, topdown=True, onerror=None, followlinks=False)

通过自上而下或自下而上遍历树,在目录树中生成文件名。对于以目录 top 为根的树中的每个目录 (包括 top 本身),它会产生一个 3 元组(dirpath、dirnames、filenames)。

除了您的脚本之外,还有其他东西可以将这些文件夹设置为只读吗?也许您正在删除它们,然后因为它们不存在而被拒绝访问,或者其他东西正在以这种方式重新创建它们?

于 2013-11-05T23:15:55.807 回答
0

我不在乎你是否写了这段代码,这没有任何意义,试图让它工作而不修复它是一个愚蠢的想法。

首先,如果要删除整个目录树,请不要尝试遍历树并在遍历之前删除每个子树。只需删除整棵树:

shutil.rmtree(eg.globals.tvzip)
shutil.rmtree(eg.globals.tvproc)

如果要删除树的所有内容,而不是根本身,请不要使用os.walk,只需os.listdir

for p in os.listdir(eg.globals.tvzip):
    shutil.rmtree(os.path.join(eg.globals.tvzip, p)
for p in os.listdir(eg.globals.tvproc):
    shutil.rmtree(os.path.join(eg.globals.tvproc, p)

这将消除由于您的代码踩到自己的脚趾而导致的任何错误,尝试保持目录打开以供其遍历并同时尝试将其删除。

如果您仍然收到错误,可能是因为某些文件是只读的,但也可能是因为某些其他程序打开了它们。您能够调试的唯一方法是知道哪些文件,以便您检查它们。

您获得的异常应该包括在其输出中失败的文件的完整路径名 - 事实上,您在其他问题之一中显示了一个:

WindowsError: [Error 5] Access is denied: 'C:\\zDump\\TVzip\\Elem.avi'

那么,你怎么知道问题是什么?

您可以C:\zDump\TVzip在资源管理器中打开并查看 Elem.avi 并查看它是否为只读。或者,如果您知道如何操作,您可以使用 DOS 提示符。

要确定它是否被另一个程序保持打开状态,您需要一个第三方工具。Sysinternals 和 Microsoft 发布的 GUI 工具Process Explorer和命令行工具Handle可能是最简单的。

于 2013-11-05T23:31:37.307 回答