Easiest way to rm -rf in Python

前端 未结 7 1589
忘了有多久
忘了有多久 2020-12-08 12:44

What is the easiest way to do the equivalent of rm -rf in Python?

7条回答
  •  忘掉有多难
    2020-12-08 13:24

    While useful, rmtree isn't equivalent: it errors out if you try to remove a single file, which rm -f does not (see example below).

    To get around this, you'll need to check whether your path is a file or a directory, and act accordingly. Something like this should do the trick:

    import os
    import shutil
    
    def rm_r(path):
        if os.path.isdir(path) and not os.path.islink(path):
            shutil.rmtree(path)
        elif os.path.exists(path):
            os.remove(path)
    

    Note: this function will not handle character or block devices (that would require using the stat module).

    Example in difference of between rm -f and Python's shutils.rmtree

    $ mkdir rmtest
    $ cd rmtest/
    $ echo "stuff" > myfile
    $ ls
    myfile
    $ rm -rf myfile 
    $ ls
    $ echo "stuff" > myfile
    $ ls
    myfile
    $ python
    Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
    [GCC 4.5.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import shutil
    >>> shutil.rmtree('myfile')
    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/lib/python2.7/shutil.py", line 236, in rmtree
        onerror(os.listdir, path, sys.exc_info())
      File "/usr/lib/python2.7/shutil.py", line 234, in rmtree
        names = os.listdir(path)
    OSError: [Errno 20] Not a directory: 'myfile'
    

    Edit: handle symlinks; note limitations as per @pevik's comment

提交回复
热议问题