55

我已阅读此功能的文档,但是,我认为我没有正确理解它。如果有人可以告诉我我缺少什么,或者我是正确的,那将是一个很大的帮助。以下是我的理解:

使用该shutil.rmtree(path)函数,它只会删除指定的目录,而不是整个路径。IE:

shutil.rmtree('user/tester/noob')

使用这个,它只会删除'noob'目录对吗?不是完整的路径?

4

4 回答 4

79

如果 noob 是一个目录,该shutil.rmtree()函数将删除noob它下面的所有文件和子目录。也就是说,noob是要移除的树的根。

于 2012-06-03T20:01:00.467 回答
31

这肯定只会删除指定路径中的最后一个目录。试试看:

mkdir -p foo/bar
python
import shutil
shutil.rmtree('foo/bar')

...只会删除'bar'.

于 2012-06-03T19:58:46.693 回答
20

这里有一些误解。

想象一棵这样的树:

 - user
   - tester
     - noob
   - developer
     - guru

如果你想删除user,就这样做shutil.rmtree('user')。这也将删除user/testeruser/tester/noob因为它们在里面user。但是,它也会删除user/developerand user/developer/guru,因为它们也在里面user

如果rmtree('user/tester/noob')会删除userand tester,如果消失了,你的意思是如何user/developer存在user


还是您的意思是http://docs.python.org/2/library/os.html#os.removedirs之类的?

它尝试删除每个已删除目录的父目录,直到由于目录不为空而失败。所以在我的示例树中,os.removedirs('user/tester/noob')会先删除noob,然后它会尝试删除tester,这没关系,因为它是空的,但它会停止user并让它不理会,因为它包含developer我们不想删除的 。

于 2013-11-11T09:31:25.067 回答
1
**For Force deletion using rmtree command in Python:**

[user@severname DFI]$ python
Python 2.7.13 (default, Aug  4 2017, 17:56:03)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import shutil
>>> shutil.rmtree('user/tester/noob')



But what if the file is not existing, it will throw below error:


>>> shutil.rmtree('user/tester/noob')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/shutil.py", line 239, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "/usr/local/lib/python2.7/shutil.py", line 237, in rmtree
    names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'user/tester/noob'
>>>

**To fix this, use "ignore_errors=True" as below, this will delete the folder at the given if found or do nothing if not found**


>>> shutil.rmtree('user/tester/noob', ignore_errors=True)
>>>

Hope this helps people who are looking for force  folder deletion using rmtree.
于 2020-02-05T11:23:13.000 回答