关于python:删除文件或文件夹

Delete a file or folder

如何删除python中的文件或文件夹?


os.remove()删除文件。

os.rmdir()删除一个空目录。

shutil.rmtree()删除一个目录及其所有内容。

pathlib.Path.unlink()删除文件或符号链接。

pathlib.Path.rmdir()删除空目录。


用于删除文件的python语法

1
2
import os
os.remove("/tmp/<file_name>.txt")

1
2
import os
os.unlink("/tmp/<file_name>.txt")

最佳实践

  • 首先,检查文件或文件夹是否存在,然后只删除该文件。这可以通过两种方式实现:A.江户十一〔18〕号b.使用exception handling.
  • os.path.isfile示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/python
    import os
    myfile="/tmp/foo.txt"

    ## If file exists, delete it ##
    if os.path.isfile(myfile):
        os.remove(myfile)
    else:    ## Show an error ##
        print("Error: %s file not found" % myfile)

    异常处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python
    import os

    ## Get input ##
    myfile= raw_input("Enter file name to delete:")

    ## Try to delete the file ##
    try:
        os.remove(myfile)
    except OSError as e:  ## if failed, report it back to the user ##
        print ("Error: %s - %s." % (e.filename, e.strerror))

    各自输出

    1
    2
    3
    4
    5
    6
    7
    Enter file name to delete : demo.txt
    Error: demo.txt - No such file or directory.

    Enter file name to delete : rrr.txt
    Error: rrr.txt - Operation not permitted.

    Enter file name to delete : foo.txt

    删除文件夹的python语法

    1
    shutil.rmtree()

    shutil.rmtree()示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/python
    import os
    import sys
    import shutil

    # Get directory name
    mydir= raw_input("Enter directory name:")

    ## Try to remove tree; if failed show an error using try...except on screen
    try:
        shutil.rmtree(mydir)
    except OSError as e:
        print ("Error: %s - %s." % (e.filename, e.strerror))


    使用

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

    (参见关于Shutil的完整文档)和/或

    1
    os.remove

    1
    os.rmdir

    (完整的操作系统文档。)


    删除文件:

    您可以使用unlinkremove

    1
    os.unlink(path, *, dir_fd=None)

    1
    os.remove(path, *, dir_fd=None)

    此函数删除(删除)文件路径。如果path是一个目录,则会引发OSError

    在python 2中,如果路径不存在,则会引发带有[errno 2]的OSError(ENOENT。在python 3中,提出了带[errno 2]的FileNotFoundError(ENOENT)。在python 3中,由于FileNotFoundErrorOSError的一个子类,捕获后者将捕获前者。

    删除文件夹:

    1
    os.rmdir(path, *, dir_fd=None)

    rmdir删除(删除)目录路径。只有当目录为空时才有效,否则会引发OSError。为了删除整个目录树,可以使用shutil.rmtree()

    1
    shutil.rmtree(path, ignore_errors=False, onerror=None)

    shutil.rmtree删除整个目录树。路径必须指向目录(但不是指向目录的符号链接)。

    如果"忽略错误"为true,则将忽略由于删除失败而导致的错误;如果为false或省略,则通过调用onerror指定的处理程序来处理这些错误;如果忽略,则会引发异常。

    参见:

    1
    os.removedirs(name)

    os.removedirs(name)递归删除目录。与rmdir()类似,但如果成功删除了叶目录,removedirs()会尝试依次删除路径中提到的每个父目录,直到出现错误为止(这被忽略,因为它通常意味着父目录不是空的)。

    例如,os.removedirs("foo/bar/baz")将首先删除目录"foo/bar/baz",然后删除"foo/bar"和"foo"(如果它们为空)。


    为你们创建一个函数。

    1
    2
    3
    4
    5
    6
    7
    8
    def remove(path):
       """ param <path> could either be relative or absolute."""
        if os.path.isfile(path):
            os.remove(path)  # remove the file
        elif os.path.isdir(path):
            shutil.rmtree(path)  # remove dir and all contains
        else:
            raise ValueError("file {} is not a file or dir.".format(path))


    您可以使用内置的pathlib模块(需要python 3.4+,但pypi上有旧版本的backport:pathlibpathlib2

    要删除文件,可以使用unlink方法:

    1
    2
    3
    import pathlib
    path = pathlib.Path(name_of_file)
    path.unlink()

    或者使用rmdir方法删除空文件夹:

    1
    2
    3
    import pathlib
    path = pathlib.Path(name_of_folder)
    path.rmdir()


    How do I delete a file or folder in Python?

    对于python 3,要分别删除文件和目录,请分别使用unlinkrmdirPath对象方法:

    1
    2
    3
    4
    5
    6
    7
    from pathlib import Path
    dir_path = Path.home() / 'directory'
    file_path = dir_path / 'file'

    file_path.unlink() # remove file

    dir_path.rmdir()   # remove directory

    注意,您也可以使用与Path对象相关的路径,并且可以使用Path.cwd检查当前的工作目录。

    有关在python 2中删除单个文件和目录的信息,请参见下面标记的部分。

    要删除包含内容的目录,请使用shutil.rmtree,并注意这在python 2和3中是可用的:

    1
    2
    3
    from shutil import rmtree

    rmtree(dir_path)

    示范

    python 3.4中的新对象是Path对象。

    让我们用一个来创建一个目录和文件来演示用法。请注意,我们使用/来连接路径的各个部分,这可以解决操作系统之间的问题,以及在Windows上使用反斜杠的问题(需要将反斜杠(如EDOCX1)(8))或使用原始字符串(如r"foo\bar"):

    1
    2
    3
    4
    5
    6
    7
    8
    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()

    现在:

    1
    2
    >>> file_path.is_file()
    True

    现在让我们删除它们。第一个文件:

    1
    2
    3
    4
    5
    >>> file_path.unlink()     # remove file
    >>> file_path.is_file()
    False
    >>> file_path.exists()
    False

    我们可以使用globbing删除多个文件-首先,让我们为此创建一些文件:

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

    然后迭代glob模式:

    1
    2
    3
    4
    5
    6
    >>> 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

    现在,演示如何删除目录:

    1
    2
    3
    4
    5
    >>> directory_path.rmdir() # remove directory
    >>> directory_path.is_dir()
    False
    >>> directory_path.exists()
    False

    如果我们想删除一个目录及其所有内容怎么办?对于这个用例,使用shutil.rmtree

    让我们重新创建目录和文件:

    1
    2
    file_path.parent.mkdir()
    file_path.touch()

    注意,除非它是空的,否则rmdir会失败,这就是为什么rmtree如此方便:

    1
    2
    3
    4
    5
    6
    7
    8
    >>> 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/excelsiora/directory'

    现在,导入rmtree并将目录传递给函数:

    1
    2
    from shutil import rmtree
    rmtree(directory_path)      # remove everything

    我们可以看到整件事都被移走了:

    1
    2
    >>> directory_path.exists()
    False

    Python 2

    如果您使用的是python 2,那么有一个名为pathlib2的pathlib模块的后端口,它可以与pip一起安装:

    1
    $ pip install pathlib2

    然后您可以将库别名为pathlib

    1
    import pathlib2 as pathlib

    或者直接导入Path对象(如此处所示):

    1
    from pathlib2 import Path

    如果太多,可以删除带有os.removeos.unlink的文件。

    1
    2
    3
    4
    from os import unlink, remove
    from os.path import join, expanduser

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

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

    您可以使用os.rmdir删除目录:

    1
    2
    3
    from os import rmdir

    rmdir(join(expanduser('~'), 'directory'))

    注意,还有一个os.removedirs—它只递归地删除空目录,但它可能适合您的用例。


    rmtree是异步函数,所以如果您想检查它何时完成,可以使用while…循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import os
    import shutil

    shutil.rmtree(path)

    while os.path.exists(path):
      pass

    print('done')


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import os

    folder = '/Path/to/yourDir/'
    fileList = os.listdir(folder)

    for f in fileList:
        filePath = folder + '/'+f

        if os.path.isfile(filePath):
            os.remove(filePath)

        elif os.path.isdir(filePath):
            newFileList = os.listdir(filePath)
            for f1 in newFileList:
                insideFilePath = filePath + '/' + f1

                if os.path.isfile(insideFilePath):
                    os.remove(insideFilePath)


    我建议您使用subprocess,如果您的茶点是编写一个漂亮且可读的代码:

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

    如果您不是软件工程师,那么可以考虑使用jupyter;您只需键入bash命令:

    1
    !rm -r my_dir

    传统上,您使用shutil

    1
    2
    import shutil
    shutil.rmtree(my_dir)