在递归函数中使用 shutil.rmtree() (Windows 10)

Using shutil.rmtree() in a recursive function (Windows 10)

我遇到了一个可能可以解决的错误,但在概念上让我感到困惑,想知道是否有人可以阐明一些问题。

当我在特定条件下递归调用 shutil.rmtree() 的目录结构时,我收到一个错误,该错误相当于试图删除一个已删除的对象。这是一个最简单的例子:

def deleteFolder(path):
    for obj in glob.glob(os.path.join(path, '*')):
        print('obj name is ',obj)
        if os.path.isdir(obj):
            deleteFolder(obj)
    print('removing path ',path)
    print(os.listdir(path))
    shutil.rmtree(path,False)


WindowsError                              Traceback (most recent call last)
<ipython-input-36-ad9561d5fc92> in <module>()
      2 #path = 'C:\Users\Wes\Desktop\Test\Morphine\Album1'
      3 #shutil.rmtree(path)
----> 4 deleteFolder('C:\Users\Wes\Desktop\Test\Level1')

<ipython-input-35-14a315bc6a80> in deleteFolder(path)
     30     print('removing path ',path)
     31     print(os.listdir(path))
---> 32     shutil.rmtree(path,False)

C:\Users\Wes\Anaconda2\lib\shutil.pyc in rmtree(path, ignore_errors, onerror)
    250                 os.remove(fullname)
    251             except os.error, err:
--> 252                 onerror(os.remove, fullname, sys.exc_info())
    253     try:
    254         os.rmdir(path)

C:\Users\Wes\Anaconda2\lib\shutil.pyc in rmtree(path, ignore_errors, onerror)
    248         else:
    249             try:
--> 250                 os.remove(fullname)
    251             except os.error, err:
    252                 onerror(os.remove, fullname, sys.exc_info())

WindowsError: [Error 2] The system cannot find the file specified: 'C:\Users\Wes\Desktop\Test\Level1\Level2'

目录结构为 /Level1/Level2/Level3 并且 fx 被称为 w/arg Level1。 显然这是一个愚蠢的例子,它正在做 shutil.rmtree 为之构建的递归,但是当你为是否删除目录添加一个条件时它更有意义。

这是打印输出:

('obj name is ', 'C:\Users\Wes\Desktop\Test\Level1\Level2')
('obj name is ', 'C:\Users\Wes\Desktop\Test\Level1\Level2\Level3')
('removing path ', 'C:\Users\Wes\Desktop\Test\Level1\Level2\Level3')
[]
('removing path ', 'C:\Users\Wes\Desktop\Test\Level1\Level2')
[]
('removing path ', 'C:\Users\Wes\Desktop\Test\Level1')
['Level2']

所以好像下到Level3,删除Level3,上移到Level2,看到Level3不再是Level2的子目录没有问题,删除Level2,但是Level1仍然看到Level2和错误。范围界定似乎有些微妙,因为它与我所缺少的 os.path 相关。

最终,我想探索一整棵树,从一些根目录开始并修剪目录,这些目录没有满足某些条件的后代(包含音频文件)。

我想,你的问题可以与这个问题联系起来:Permission denied doing os.mkdir(d) after running shutil.rmtree(d) in Python

shutil.rmtree on Windows 恰好 return 而不是文件实际删除时。您可以想象这是以某种异步方式完成的,因此随后的 rmtree 调用 may conflict。这也是为什么 pip install 在清理阶段使用 shutil.rmtree 删除其缓存文件时有时会失败的原因。

尝试在每次 rmtree 调用后添加 time.sleep(1) - 有帮助吗? 如果是这样,您的解决方案是在出现此类错误后重试删除文件,或者收集要删除的目录并有选择地删除它们以避免冲突。