原文: How to Delete a File in Python – And Remove a Directory, Too

Python 提供了许多标准的实用程序模块,在我们构建的应用程序中实现一些功能。在这篇文章中,我们将学习删除文件和目录的模块。

在 Python 中最流行的模块之一是 os 模块。这是标准的实用模块之一。这个模块提供了与设备的操作系统交互的各种功能。它允许我们对文件和目录进行处理。

另一个模块是 shutil,它用于高级文件操作。

在这篇文章中,我将向你展示如何在 Python 中使用这些模块来删除文件和删除目录。我将在我的 Mac 设备上测试这些例子,但你也可以在你安装了 Python 的任何其他类型的设备上测试它们。

os 模块概述

os 模块允许我们在 Windows、Mac 和 Linux 上执行操作系统任务。

要使用这个模块,你首先要导入它:

import os

这个模块有不同的属性和功能,我们可以用来访问关于操作系统的不同信息,也可以运行一些与文件有关的任务。

例如,有一个 name 属性,它返回你使用该模块的设备所导入的操作系统模块的名称。在我的 Mac 设备上,运行 python test.py 后(其中 test.py 是包含我的代码的文件),我得到的结果是这样的:

import os

print(os.name)
# posix

还有一个 environ 对象,它包含所有的环境变量和它们的值:

import os

print(os.environ)
# {
#   ...
#   'SHELL': '/bin/zsh',
#   'HOMEBREW_REPOSITORY': '/opt/homebrew',
#   ...
#   'ZSH': '/Users/dillion/.oh-my-zsh',
#   'NVM_DIR': '/Users/dillion/.nvm',
#   'USER': 'dillion'
#   ...
# }

在我的设备上运行这个后,我得到了一堆环境变量。我在上面列出了几个,你可以看到 SHELLZSHUSER 变量。

要获得一个特定变量的值,你可以使用 get() 方法。这里有一些例子:

import os

homeEnv = os.environ.get('HOME')
# /Users/dillion

shellEnv = os.environ.get('SHELL')
# /bin/zsh

zshEnv = os.environ.get('ZSH')
# /Users/dillion/.oh-my-zsh

userEnv = os.environ.get('USER')
# dillion

shutil 模块概述

os 模块更侧重于操作系统的任务(取决于所使用的操作系统),而 shutil 模块是用于 Python 的高级文件操作,如复制和删除文件。

要使用这个模块,你还得先导入它:

import shutil

这个模块也有一些方法,你可以用来进行文件和目录操作。让我们看看一些例子。

有一个 move 目录,它允许你将一个文件从一个位置移动到一个目的地。这里有一个 test.py 的例子:

import shutil

shutil.move("./test.py", "temp/")

当我运行 python test.py 时,test.py 文件被移到 temp 目录中。如果该文件或目录不存在,你会得到一个错误。

这个模块的另一个方法是 copytree,它把一个目录的内容复制到一个目的地。假设我们有一个叫做 directory1/ 的文件夹,里面有以下文件:

directory1
├── file1.py
└── test
   └── file2.py

这个目录有一个名为 file1.py 的文件和一个名为 test 的目录,后者又包含一个名为 file2.py 的文件。

现在让我们看看如何将这些文件从 directory1 移到一个叫作 directory2 的新目录:

import shutil

shutil.copytree("directory1/", "directory2/")

当你运行上面的代码时,directory2 被创建,而 directory1 的内容被复制到 directory2

现在我们已经看到了一些例子,让我们看看如何删除一个文件和删除一个目录。

如何在 Python 中删除一个文件

os 模块有一个 remove() 方法,允许你删除一个文件。这样的文件会被永久地删除——而不是在回收站中。这里有一个例子:

import os

os.remove('./temporary.txt')

这个方法接受文件路径参数,在这里你指定你想删除的文件的位置。如果这样的文件不存在,运行上面的命令会产生这样的错误:

FileNotFoundError: [Errno 2] No such file or directory: './temporary.txt'

因此,让我首先创建这个文件。我将在我的命令行上这样做:

touch temporary.txt
echo "new file" > temporary.txt

现在我有了带有 “new file” 文字的 temporary.txt 文件。当我运行 Python 时,这个文件将被删除:

python test.py
#  file now deleted

另一个改进你的代码的方法是,在调用 remove 方法之前,首先检查文件是否存在。你可以使用 path.isfile() 方法,如下:

import os

fileExists = os.path.isfile('./temporary.txt')

if fileExists:
    os.remove('./temporary.txt')

首先,我们通过调用 os 模块的 path 属性的 isfile() 方法来检查 temporary.txt 是否存在。这个方法根据该文件是否存在而返回 TrueFalse。然后,在调用 remove 方法之前,你可以使用 if 语句来测试返回的布尔值。

如何在 Python 中删除一个目录

os 模块也有 rmdir 方法,你可以用它来删除一个文件夹。但是,这个文件夹必须是空的。这里有一个例子:

import os

os.rmdir('directory1/')

如果 directory1 存在并且是空的,它将被删除。如果它不存在,你会得到一个 No such file or directory 错误。如果它存在但不是空的,你会得到一个 Directory not empty 的错误。那么,你如何删除非空的目录?

记得我说过 shutil 是用于高级文件操作的吗?嗯,这也是它有用的地方——用于删除空和非空的目录。

shutilrmtree 方法,用于删除一个目录(以及它的所有内容,如文件、子文件、子目录等等)。

这里有一个例子:

import shutil

shutil.rmtree('directory2/')

如果 directory2 不存在,你会得到一个 No such file or directory 错误。但如果该目录存在且不为空,它将被删除。即使它是空的,它也会被删除。

总结

在构建应用程序时,有时你想创建、删除、修改、复制或执行其他文件操作。借助 Python 中的一些标准模块,你可以实现这些操作。

在这篇文章中,我向你展示了如何使用 Python 中的 osshutil 标准模块来删除设备上的文件和目录。