Python更改文件夹权限

时间:2013-11-05 23:04:33

标签: python

由于某种原因,此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))

2 个答案:

答案 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可能是最简单的。