我遇到的错误可能会解决,但在概念上让我感到困惑,并想知道是否有人可以解释一下。
当我在一定条件下通过调用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有关。
最后,我想从一些根目录和修剪目录开始探索整个树,这些目录没有符合某些标准的后代(包含音频文件)。
答案 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
- 这有帮助吗?
如果是这样,您的解决方案将是在发生此类错误后重试删除文件或收集要删除的目录并有选择地删除它们以避免冲突。