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

时间:2016-08-14 22:02:25

标签: python windows python-2.7 recursion shutil

我遇到的错误可能会解决,但在概念上让我感到困惑,并想知道是否有人可以解释一下。

当我在一定条件下通过调用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有关。

最后,我想从一些根目录和修剪目录开始探索整个树,这些目录没有符合某些标准的后代(包含音频文件)。

1 个答案:

答案 0 :(得分:0)

我认为,您的问题可以与此问题相关联:Permission denied doing os.mkdir(d) after running shutil.rmtree(d) in Python

Windows上的

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

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