Python使用shutil模块操作文件/文件夹
Python的标准库中os模块已经可以操作文件了,但是具有很多局限性(比如不能复制文件),因此Python的另一个标准库shutil对文件/文件夹的移动,复制,删除文件夹,压缩,解压等操作做了增强,更加方便用户进行使用。
1、复制文件/文件夹(shutil.copy(src,dst))
1.1 复制文件
复制文件常用的方法是shutil.copy(src,dst)和shutil.copy2(src,dst),这两者都可以将文件从一个文件夹复制到另一个文件夹,并且在可以在重命名复制后的文件名。这两个函数的入参都是一样的,其中src表示待复制文件的路径,dst可以是复制到的目标文件夹路径,也可以是目标文件路径(此时就可以执行重命名操作了)。下面展示了两个可能出现的常用场景以及其结果。
① 将文件复制到,已存在的目标文件夹
import shutil
shutil.copy("./待复制文件夹/待复制文件.txt", "./复制目标文件夹")
执行后"待复制文件.txt"就会被复制到目标文件夹中,但需要注意这里的目标文件夹一定是存在的,如果目标文件夹不存在,则会被视为文件名,从而被程序视为一个文件复制到另一个文件。例如下例子:
import shutil
# 复制到不存在的文件夹
shutil.copy("./待复制文件夹/待复制文件.txt", "./不存在的目标文件夹")
执行上述代码后,会在我当前根目录下生成一个"不存在的目标文件夹"的文件,这样显然不是我们所想要的,因此我们在使用copy将文件复制到另一个文件夹时要保证文件夹存在。
② 将文件复制到指定位置并改变文件名称
我们可以在复制文件同时更改文件的名称(上面的例子中已经接触到了)
import shutil
# 复制文件到目标文件夹并改名
shutil.copy("./待复制文件夹/待复制文件.txt", "./复制目标文件夹/新文件名.txt")
得到结果就是:
注意:如果在目标路径下已经存在了一个同名的文件,那么将会被覆盖。
1.2 复制文件夹
与复制文件类似,不过由于是复制文件夹因此我们需要使用地递归复制(因为文件夹中可能还有子文件夹),因此使用shutil.copytree()
import shutil
# 递归复制文件夹
shutil.copytree("./待复制文件夹", "./复制目标文件夹2")
需要注意的是如果目标文件夹不能是已经存在的文件夹,比如如果我的目标文件夹是"./复制目标文件夹",就会抛出异常: FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: './复制目标文件夹
2、移动文件/文件夹(shutil.move(src, dst))
移动文件/文件夹的方法比较简单,需要提到的是在移动时我们仍然可以对文件/文件夹重名,比如下例:
import shutil
# 移动到目标文件夹
shutil.move("./待移动文件夹/待移动文件.txt", "./目标文件夹/移动后改名.txt")
移动文件夹也是类似,下面的例子我把"待移动文件夹"移动到了./目标文件夹中成为其子文件夹了
# 移动文件夹
shutil.move("./待移动文件夹", "./目标文件夹")
# 移动文件夹
shutil.move("./待移动文件夹", "./目标文件夹2")
3、删除文件夹(shutil.rmtree(src))
递归删除文件夹,注意这个方法只能删除文件夹,如果传入的路径不是文件夹则会抛出异常: NotADirectoryError: [WinError 267] 目录名称无效。: './待删除文件.txt'
# 删除文件夹
shutil.rmtree("./待删除夹")
如果要删除文件推荐使用: os.remove()
4、压缩文件(shutil.make_archive(base_name, format, root_dir))
- base_name:压缩包的名称,不包括后缀名。例如,如果base_name为example,则生成的归档文件名为example.zip(如果format为"zip")。
- format:压缩文件的格式,可以是"zip"、"tar"、"gztar"或`"bztar"`中的一个。分别表示zip格式、tar格式、gzip压缩的tar格式和bzip2压缩的tar格式。
- root_dir:要归档的目录的路径。
例如下面的例子:
# 压缩文件
shutil.make_archive("./压缩后命名", "zip", "./待压缩文件夹")
得到的结果:
4、解压文件(shutil.unpack_archive(filename, extract_dir, format))
- filename:压缩包文件的所在的路径
- extract_dir:解包后文件的存放目录,如果 `extract_dir` 没有指定,则默认解包到当前工作目录下。
- format 是归档文件的格式。
# 解压文件
shutil.unpack_archive("./压缩后命名.zip", "./解压后文件夹")
参考链接
Python模块——shutil模块详解_shutils-CSDN博客
python之shutil模块11个常用函数详解 - 知乎 (zhihu.com)
python操作文件,强大的shutil模块 - 简书 (jianshu.com)