How to delete a file or folder?

前端 未结 13 1123
青春惊慌失措
青春惊慌失措 2020-11-22 12:29

How do I delete a file or folder in Python?

13条回答
  •  遇见更好的自我
    2020-11-22 13:21

    How do I delete a file or folder in Python?

    For Python 3, to remove the file and directory individually, use the unlink and rmdir Path object methods respectively:

    from pathlib import Path
    dir_path = Path.home() / 'directory' 
    file_path = dir_path / 'file'
    
    file_path.unlink() # remove file
    
    dir_path.rmdir()   # remove directory
    

    Note that you can also use relative paths with Path objects, and you can check your current working directory with Path.cwd.

    For removing individual files and directories in Python 2, see the section so labeled below.

    To remove a directory with contents, use shutil.rmtree, and note that this is available in Python 2 and 3:

    from shutil import rmtree
    
    rmtree(dir_path)
    

    Demonstration

    New in Python 3.4 is the Path object.

    Let's use one to create a directory and file to demonstrate usage. Note that we use the / to join the parts of the path, this works around issues between operating systems and issues from using backslashes on Windows (where you'd need to either double up your backslashes like \\ or use raw strings, like r"foo\bar"):

    from pathlib import Path
    
    # .home() is new in 3.5, otherwise use os.path.expanduser('~')
    directory_path = Path.home() / 'directory'
    directory_path.mkdir()
    
    file_path = directory_path / 'file'
    file_path.touch()
    

    and now:

    >>> file_path.is_file()
    True
    

    Now let's delete them. First the file:

    >>> file_path.unlink()     # remove file
    >>> file_path.is_file()
    False
    >>> file_path.exists()
    False
    

    We can use globbing to remove multiple files - first let's create a few files for this:

    >>> (directory_path / 'foo.my').touch()
    >>> (directory_path / 'bar.my').touch()
    

    Then just iterate over the glob pattern:

    >>> for each_file_path in directory_path.glob('*.my'):
    ...     print(f'removing {each_file_path}')
    ...     each_file_path.unlink()
    ... 
    removing ~/directory/foo.my
    removing ~/directory/bar.my
    

    Now, demonstrating removing the directory:

    >>> directory_path.rmdir() # remove directory
    >>> directory_path.is_dir()
    False
    >>> directory_path.exists()
    False
    

    What if we want to remove a directory and everything in it? For this use-case, use shutil.rmtree

    Let's recreate our directory and file:

    file_path.parent.mkdir()
    file_path.touch()
    

    and note that rmdir fails unless it's empty, which is why rmtree is so convenient:

    >>> directory_path.rmdir()
    Traceback (most recent call last):
      File "", line 1, in 
      File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
        self._accessor.rmdir(self)
      File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
        return strfunc(str(pathobj), *args)
    OSError: [Errno 39] Directory not empty: '/home/username/directory'
    

    Now, import rmtree and pass the directory to the funtion:

    from shutil import rmtree
    rmtree(directory_path)      # remove everything 
    

    and we can see the whole thing has been removed:

    >>> directory_path.exists()
    False
    

    Python 2

    If you're on Python 2, there's a backport of the pathlib module called pathlib2, which can be installed with pip:

    $ pip install pathlib2
    

    And then you can alias the library to pathlib

    import pathlib2 as pathlib
    

    Or just directly import the Path object (as demonstrated here):

    from pathlib2 import Path
    

    If that's too much, you can remove files with os.remove or os.unlink

    from os import unlink, remove
    from os.path import join, expanduser
    
    remove(join(expanduser('~'), 'directory/file'))
    

    or

    unlink(join(expanduser('~'), 'directory/file'))
    

    and you can remove directories with os.rmdir:

    from os import rmdir
    
    rmdir(join(expanduser('~'), 'directory'))
    

    Note that there is also a os.removedirs - it only removes empty directories recursively, but it may suit your use-case.

提交回复
热议问题