在 Python 中,os 模块操作文件或文件夹的能力是有限的,因此还需借助其他模块来辅助开发。接下来介绍 shutil 模块,它可以帮助我们实现这 3 种操作:复制文件、移动文件和删除文件。
Python shutil 复制文件
在 Python 中,我们可以使用 shutil 模块的 copy() 函数将一个文件复制到另一个文件夹中。
语法:
shutil.copy(src, dest)说明:
参数 src 表示源路径,参数 dest 表示目标路径。dest 指向的是一个文件,也可以是一个文件夹。
接下来在当前项目下创建两个文件夹:src 和 dest,然后在 src 文件夹中创建一个 A.txt,整个项目结构如下图所示。

示例 1:复制但不改名
import shutil
shutil.copy('src/A.txt', 'dest')运行之后,项目结构变成如下图所示。

分析:
从结果可以看出来,A.txt 这个文件已经被复制到 “dest” 这个文件夹下了。当然了,这里使用绝对路径也是可以的,下面两种方式是等价的。
# 相对路径
shutil.copy('src/A.txt', 'dest')
# 绝对路径
shutil.copy(r'D:\python-test\src\A.txt', r'D:\python-test\dest')示例 2:复制并改名
import shutil
shutil.copy('src/A.txt', 'dest/B.txt')运行之后,项目结构变成如下图所示。

分析:
如果 B.txt 一开始是不存在的,则上面示例表示将 A.txt 复制过去并改名为 B.txt。如果 B.txt 文件一开始是存在的,则上面示例表示用 A.txt 的内容替换 B.txt 的内容。
上面两个例子是不一样的,第一个是复制文件但不改变文件名,而第二个是复制文件并且改变文件名,小伙伴们要认真对比一下两者的不同。
想要复制一个文件,可以使用 copy() 函数。但如果想要复制一个文件夹,此时应该怎么做呢?我们可以使用 copytree() 函数来实现。
示例 3:复制文件夹
import shutil
shutil.copytree('src', 'src-backup')运行代码之后,项目结构变成如下图所示。

分析:
在上面示例中,copytree() 函数会创建一个名为 “src-backup” 的新文件夹,然后把 src 中的所有文件复制一份到 src-backup 中。一般来说,copytree() 函数都是用来备份文件的。
Python shutil 移动文件
在 Python 中,我们可以使用 shutil 模块的 move() 函数将一个文件或文件夹移动到另一个文件夹中。
语法:
shutil.move(src, dest)说明:
参数 src 表示源路径,参数 dest 表示目标路径。接下来,调整一下目录结构为下图所示。

示例 4:移动但不改名
import shutil
shutil.move('src/A.txt', 'dest')运行之后,项目结构变成如下图所示。

分析:
从结果可以看出来,src 文件夹中的 A.txt 被移动到了 dest 文件夹中。
示例 5:移动并改名
import shutil
shutil.move('src/B.txt', 'dest/BB.txt')运行之后,项目结构如下图所示。

分析:
从结果可以看出,src 文件夹中的 B.txt 被移动到了 dest 文件夹中,并且被重命名为 BB.txt。
上面是将文件进行移动,接下来尝试移动一下文件夹。为了测试效果,需要清空 src 和 dest 这两个文件夹,然后在当前项目中新建两个文件夹:animal 和 planet,并且往这两个文件夹中添加一些文件,整个项目结构如下图所示。

示例 6:移动文件夹
import shutil
shutil.move('animal', 'dest')
shutil.move('planet', 'dest')运行之后,项目结构变成如下图所示。

分析:
从结果可以看出,animal 和 planet 这两个文件夹已经被移动到 dest 文件夹下了。需要注意的是,移动文件夹使用的也是 move() 函数,而不是 movetree() 函数。
Python shutil 删除文件夹
在 Python 中,我们可以使用 shutil 模块的 rmtree() 函数删除文件夹。
语法:
shutil.rmtree(path)说明:
rmtree 是 “remove tree” 的缩写,rmtree() 函数会将该文件夹及其内部文件全部删除。为了测试后面示例的效果,需要将当前项目目录结构重塑成如下图所示。

示例 7:删除文件夹
import shutil
shutil.rmtree('src')运行之后,项目结构变成如下图所示。

分析:
从结果可以看出,src 这个文件夹以及它内部所有的文件,都已经被删除了。特别注意,使用 unlink() 和 rmtree() 这两个函数,文件或文件夹被删除后,并不是被放到回收站了,而是被永久删除了!因此大家在使用这两种方法的时候,一定要特别小心。
需要注意的是,上一节讲过的 os.rmdir() 只能删除 “空的文件夹”。而 shutil.rmtree() 则非常霸道,无论文件夹里有多少层文件和子目录,它都会将其连根拔起、彻底删除。所以在执行这个函数时,一定要小心!
提示: shutil 模块的 rmtree() 函数用于删除文件夹,如果想要删除文件,应该使用 pathlib 模块的 unlink() 方法。
