os模块提供了对文件和文件夹的一般常用操作,而shutil则是对os的补充,提供了复制、移动、删除压缩、解压等操作。
需要注意的是,shutil模块对压缩包的处理是调用zipfile或tarfile这两个模块来进行的
下面的代码中,出现的 D:\test\ 目录下的文件结构为:
主要的方法有:
1. 复制文件或文件夹:
shutil.copy(src,dst)复制文件
shutil.copytree(src,dst)复制文件夹
import shutil
shutil.copy(r"D:\test\1.txt",r"D:\test\6.txt")
shutil.copytree(r"D:\test\2",r"D:\test\4")
运行代码后,test文件的目录树为:
1.txt 文件也完成了复制:
2. 移动文件或文件夹:shutil.move(src,dst)
import shutil
shutil.move(r"D:\test\4",r"D:\test\2")
shutil.move(r"D:\test\6.txt",r"D:\test\2")
运行程序后,test文件的目录树和 D:\test\2 下的文件目录分别为:
3. 删除文件夹(不能删除文件):shutil.rmtree(src)
注:无论被删除的文件下是否有子文件,它都能删除,因此要慎用!!!
import shutil
shutil.rmtree(r"D:\test\2\4")
运行程序后,test文件的文件树为:
4. 创建和解压压缩包:
4.1 创建压缩包和读取压缩包中的内容
zipobj.write() 创建压缩包
zipobj.namelist() 读取压缩包中的文件信息
import zipfile
import os
# 创建和解压压缩包
with zipfile.ZipFile(r"D:\test\我创建的压缩包.zip","w") as zipobj:
# 创建压缩包【两种方式都可以自己试一下】
# 方式一
# 注意:这样只会压缩文件夹2,而文件夹2下面的文件是不会被压缩的
zipobj.write(r"D:\test\2")
# 方式二
# 要想压缩文件夹2下面的所有文件,应该这样压缩
# 1.获取指定文件下的所有文件和子文件夹的名称
files = os.listdir(r"D:\test\2")
# 2.进行遍历,将每一个文件都压缩进 我创建的压缩包.zip 中
for file in files:
# 注意,如果直接这样写,会报错:zipobj.write(file)
# 因为这么写的话,系统会找不到指定的文件路径,此时需要拼接一下路径
zipobj.write(os.path.join(r"D:\test\2",file))
# 注意:但是使用这种方法不能压缩每一个子文件夹下的文件,要想解决这个问题
# 只能继续递归遍历,或者是找其他的解决办法
运行完程序后,就能创建成功:
注意此时文件夹3下面是没有文件的:
4.2 解压压缩包
zipobj.extract() 将压缩包中的单个文件,解压出来
zipobj.extractall() 将压缩包中的所有文件,解压出来
import zipfile
with zipfile.ZipFile(r"D:\test\我创建的压缩包.zip", "r") as zipobj:
# 读取压缩包中的文件信息
# 注意:使用namelist方法是不需要传参的
# 他会自动将该包下所有的文件和子文件以及子文件下的每一个内容都遍历出来
res = zipobj.namelist()
print(res)
# 将压缩包中的单个文件,解压出来
# 注意:第一个参数:获取要解压的文件【test/2/2.txt】第二个参数:选择要解压到的路径
zipobj.extract(res[0],r"D:\test")
# 将压缩包中的所有文件,解压出来
# 此时就不需要传入要解压的文件名或子文件名,只需要传入要解压到的路径
zipobj.extractall(r"D:\test\demo")
程序运行结果为:
此时,test文件的目录树为:
被解压出来的2.txt文件的位置在这里: