How to delete a file or folder?

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

How do I delete a file or folder in Python?

相关标签:
13条回答
  • 2020-11-22 13:13

    I recommend using subprocess if writing a beautiful and readable code is your cup of tea:

    import subprocess
    subprocess.Popen("rm -r my_dir", shell=True)
    

    And if you are not a software engineer, then maybe consider using Jupyter; you can simply type bash commands:

    !rm -r my_dir
    

    Traditionally, you use shutil:

    import shutil
    shutil.rmtree(my_dir) 
    
    0 讨论(0)
  • 2020-11-22 13:16

    You can use the built-in pathlib module (requires Python 3.4+, but there are backports for older versions on PyPI: pathlib, pathlib2).

    To remove a file there is the unlink method:

    import pathlib
    path = pathlib.Path(name_of_file)
    path.unlink()
    

    Or the rmdir method to remove an empty folder:

    import pathlib
    path = pathlib.Path(name_of_folder)
    path.rmdir()
    
    0 讨论(0)
  • 2020-11-22 13:17

    To avoid the TOCTOU issue highlighted by Éric Araujo's comment, you can catch an exception to call the correct method:

    def remove_file_or_dir(path: str) -> None:
        """ Remove a file or directory """
        try:
            shutil.rmtree(path)
        except NotADirectoryError:
            os.remove(path)
    

    Since shutil.rmtree() will only remove directories and os.remove() or os.unlink() will only remove files.

    0 讨论(0)
  • 2020-11-22 13:18

    Use

    shutil.rmtree(path[, ignore_errors[, onerror]])
    

    (See complete documentation on shutil) and/or

    os.remove
    

    and

    os.rmdir
    

    (Complete documentation on os.)

    0 讨论(0)
  • 2020-11-22 13:18

    My personal preference is to work with pathlib objects - it offers a more pythonic and less error-prone way to interact with the filesystem, especially if You develop cross-platform code.

    In that case, You might use pathlib3x - it offers a backport of the latest (at the date of writing this answer Python 3.10.a0) Python pathlib for Python 3.6 or newer, and a few additional functions like "copy", "copy2", "copytree", "rmtree" etc ...

    It also wraps shutil.rmtree:

    $> python -m pip install pathlib3x
    $> python
    >>> import pathlib3x as pathlib
    
    # delete a directory tree
    >>> my_dir_to_delete=pathlib.Path('c:/temp/some_dir')
    >>> my_dir_to_delete.rmtree(ignore_errors=True)
    
    # delete a file
    >>> my_file_to_delete=pathlib.Path('c:/temp/some_file.txt')
    >>> my_file_to_delete.unlink(missing_ok=True)
    
    

    you can find it on github or PyPi


    Disclaimer: I'm the author of the pathlib3x library.

    0 讨论(0)
  • 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 "<stdin>", line 1, in <module>
      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.

    0 讨论(0)
提交回复
热议问题