在递归函数中使用 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)
- 有帮助吗?
如果是这样,您的解决方案是在出现此类错误后重试删除文件,或者收集要删除的目录并有选择地删除它们以避免冲突。
我遇到了一个可能可以解决的错误,但在概念上让我感到困惑,想知道是否有人可以阐明一些问题。
当我在特定条件下递归调用 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)
- 有帮助吗?
如果是这样,您的解决方案是在出现此类错误后重试删除文件,或者收集要删除的目录并有选择地删除它们以避免冲突。