文章目录
引入
什么是shutil模块
- shutil 模块是 Python 的内置模块 : 高级的文件操作模块
- 用于文件, 文件夹, 压缩包处理, 也主要用于文件的拷贝
一、shutil 模块的常用方法介绍
1.copyfileobj( )
-
用法:
shutil.copyfileobj([file1],[file2])
-
将文件1 的数据覆盖给 文件2
import shutil # test.txt 文件内容 "i am f1, taoxiaoxin" with open("test.txt","rt",encoding="utf-8")as f1,\ open("test2.txt","w+t",encoding="utf-8")as f2: shutil.copyfileobj(f1,f2) f2.seek(0) print(f2.read()) # i am f1, taoxiaoxin
2.copyfile( )
-
用法 :
shutil.copyofile([文件名1],[文件名2])
-
不用打开文件, 直接用文件名进行覆盖拷贝 (目标文件不需要存在)
import shutil shutil.copyfile("test.txt", "test3.txt") print(open("test3.txt").read()) # i am f1, taoxiaoxin
3.copymode( )
-
用法 :
shutil.copymode([文件1],[文件2])
-
只拷贝文件的权限, 而内容、組、用户均不改变 (目标文件必须存在)
-
ps :
os.stat
: 获取文件属性import os print(os.stat("test.txt")) # 获取到一个类似于元组,可索引取值 ''' os.stat_result(st_mode=33060, st_ino=8444249301325069,st_dev=1317905668,\ st_nlink=1,st_uid=0, st_gid=0, st_size=15, st_atime=1608454814, \ st_mtime=1608454076, st_ctime=1608453477) ''' import shutil, os print(os.stat("test.txt")[0]) # 33206 (取到的是"test"的权限) print(os.stat("test3.txt")[0]) # 33206 ("test3"的权限) shutil.copymode("test.txt", "test3.txt") # 将"test"的权限覆盖给"test3" print(os.stat("test3.txt")[0]) # 33206 (再次查看发现已经改变)
4.copystat( )
-
用法 :
shutil.copystat([文件1],[文件2])
-
只拷贝文件的状态信息, 包括 : mode bits, atime, mtime, flags (目标文件必须存在)
-
示例 : 以 atime 和 mtime 的变化来做演示
import shutil,os f = open("test5.txt","w") # 创建一个新文件 res = os.stat("test.txt") res2 = os.stat("test5.txt") print(res[-3],res[-2]) # 1610202192 1610202192 (atime,mtime) print(res2[-3],res2[-2]) # 1610205015 1610205015 shutil.copystat("test.txt","test5.txt") # 进行状态信息拷贝 res3 = os.stat("test.txt") res4 = os.stat("test5.txt") print(res3[-3],res3[-2]) # 1610202192 1610202192 print(res4[-3],res4[-2]) # 1610202192 1610202192 (可以发现一样了)
5.copy( )
-
用法 :
shutil.copy([文件1],[文件2])
-
文件和权限都进行拷贝
import shutil print(open("test.txt","r").read()) # i am test print(open("test5.txt","r").read()) # i am test5 shutil.copy("test.txt","test5.txt") print(open("test.txt","r").read()) # i am test print(open("test5.txt","r").read()) # i am test
6.copy2( )
-
用法 :
shutil.copy2([文件1],[文件2])
-
文件和状态信息进行拷贝
import shutil shutil.copy2("test.txt","test2.txt")
7.copytree( )
shutil.copytree([源目录],[目标目录],symlinks=False,ignore=None)
shutil.ignore_patterns([需要排除的文件])
- 递归的去拷贝文件夹, 目标目录必须不能存在, 并且需要对源目录的父目录主要有可写权限
- ignone 指的是要排除的文件, symlinks 指的是将软连接拷贝成硬链接, 默认False
-
ps :
os.liatdir( )
: 获取指定目录下的子文件及子目录
import shutil,os
print(os.listdir("./aaa")) # ['111.txt', '222.txt', '333.txt', '444.txt']
shutil.copytree("aaa","bbb",ignore=shutil.ignore_patterns("222.txt")) # 排除"222.txt"
print(os.listdir("./bbb")) # ['111.txt', '333.txt', '444.txt']
8.rmtree( )
- 用法 :
shutil.rmtree([目标目录])
- 递归删除目录下的目录和文件
import shutil,os
print(os.listdir("./bbb")) # ['ccc']
print(os.listdir("./bbb/ccc")) # ['bbb.txt', 'dddd', 'test5.txt']
shutil.rmtree("./bbb/ccc")
print(os.listdir("./bbb")) # [] ("ccc"已经被删除)
9.move( )
-
用法 :
shutil.move([源文件],[指定路径])
-
递归的移动文件, 类似于 mv 命令, 其实就是重命名
import shutil,os print(os.listdir("./aaa")) # ['111.txt', '222.txt', '333.txt', 'ccc'] shutil.move("./aaa","./bbb") print(os.listdir("./bbb")) # ['111.txt', '222.txt', '333.txt', 'ccc']
10.make_archive( )
- 用法 :
shutil.make_archive([base_name],[format],[root_dir],....)
- 创建压缩包并返回文件路径
- 参数:
参数 | 说明 |
---|---|
base_name | 压缩包路径及名字 (只写名字默认保存在当前目录) |
format | 压缩包类型 : “zip” “tar” “bztar” “gztar” |
root_dir | 要压缩的文件夹路径 (默认当前路径) |
owner | 用户 (默认是当前用户) |
group | 组 (默认是当前组) |
logger | 用于记录日志 (通常是logger.Logger对象) |
import shutil,os
print(os.listdir("./bbb")) # ['ccc']
shutil.make_archive("./bbb/shawn","tar",root_dir="./bbb/ccc")
print(os.listdir("./bbb")) # ['ccc', 'shawn.tar']
-
shutil 对压缩包的处理实际上是调用了 ZipFile 与 TarFile 这两个模块 :
-
zipfile 模块
import zipfile,os # 压缩 import zipfile z = zipfile.ZipFile("shawn.zip","w") z.write("./bbb") # 将"bbb"这个目录加入压缩包 z.write("./ttt.txt") # 将"ttt.txt"加入压缩包 z.close() print(os.listdir("./")) # ['bbb', 'ccc', 'shawn.zip', 'ttt.txt'] # 解压 z = zipfile.ZipFile("shawn.zip","r") z.extractall(path="./ccc") # 解压到 "./ccc" 中 z.close() print(os.listdir("./ccc")) # ['bbb', 'ttt.txt']
-
tarfile 模块
import tarfile,os # 压缩 t = tarfile.open("./song.tar","w") t.add("./bbb",arcname="bbb.bak") # 将"bbb"这个目录加入压缩包 t.add("./ttt.txt",arcname="ttt.bak") # # 将"ttt.txt"加入压缩包 t.close() print(os.listdir("./")) # ['bbb', 'ccc', 'song.tar', 'ttt.txt'] # 解压 t = tarfile.open("./song.tar","r") t.extractall("./ccc") # 解压到 "./ccc" 中 t.close() print(os.listdir("./ccc")) # ['bbb.bak', 'ttt.bak']
-