由于某种原因,此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))
答案 0 :(得分:0)
如果你想删除整个苍蝇树,shutil.rmtree
会为你做 - 你不需要走掉删除它们的文件列表。
如果您尝试不删除顶级目录,则应添加一个检查。根据文档,您将获得顶级目录:
os.walk(top,topdown = True,onerror = None,followlinks = False)
生成 通过自上而下遍历树来访问目录树中的文件名 或自下而上。对于以目录顶部为根的树中的每个目录 (包括顶部本身),它产生一个3元组(dirpath,dirnames, 文件名)。
除了您的脚本以外的其他内容可以将这些文件夹设置为只读吗?也许你正在删除它们,然后因为它们不存在而被拒绝访问,或者其他东西正在以这种方式重新创建它们?
答案 1 :(得分: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可能是最简单的。