一、简述
我们在日常处理文件时,经常用到os模块,但是有的时候你会发现,像拷贝、删除、打包、压缩等文件操作,在os模块中没有对应的函数去操作,下面我们就来讲讲高级的 文件、文件夹、压缩包 处理模块:shutil
二、模块详解
1、shutil.copyfileobj(fsrc, fdst)
功能:把一个文件的内容拷贝到另外一个文件中,可以是部分文件内容。
with open("f_old",'r',encoding="utf-8") as f1,\open("f_new","w",encoding="utf-8") as f2:shutil.copyfileobj(f1,f2) #拷贝文件的内容
注:经过试验,目前试验不出可以拷贝部分文件内容,先忘记可以拷贝部分内容把。
2、shutil.copyfile(src, dst)
功能:拷贝文件,但是不拷贝所有权限
shutil.copyfile("f_old","f_new") #同一目录下拷贝文件
shutil.copyfile(r'D:\PycharmProjects\pyhomework\day5\shutil_mode\shutil_mod\f_old',r'd:\f_new') #通过绝对路径拷贝文件
3、shutil.copymode(src, dst)
功能:拷贝文件的文件权限
[root@whtest137 ~]# ll
total 8
-rwxr-xr-x 1 root root 0 Apr 1 16:05 zhangqigao #有执行权限
-rw-r--r-- 1 whtest whtest 0 Apr 1 16:06 zhangqigao_old #没有执行权限
>>> import os,shutil
>>> os.chdir("/root")
#拷贝"zhangqigao_old"权限给"zhangqigao"
>>> shutil.copymode("zhangqigao_old","zhangqigao")
[root@whtest137 ~]# ll
total 8
-rw-r--r-- 1 root root 0 Apr 1 16:05 zhangqigao # 获得跟"zhangqigao_old"一样的文件权限
-rw-r--r-- 1 whtest whtest 0 Apr 1 16:06 zhangqigao_old
4、shutil.copystat(src, dst)
功能:拷贝文件的状态信息,如:mode bits, atime, mtime, flags
#两个文件的创建时间和用户权限都不同
[root@jenkins_sh temp]# ll
total 0
-rw-r--r-- 1 root root 0 Apr 1 17:31 zhangqigao
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
#python操作
>>> import os,shutil
>>> os.chdir("/temp")
#zhangqigao 这个文件状态
>>> os.stat("zhangqigao")
posix.stat_result(st_mode=33188, st_ino=76808194, st_dev=2053L, st_nlink=1,
st_uid=0, st_gid=0, st_size=0, st_atime=1491039109, st_mtime=1491039109,
st_ctime=1491039109)
#zhangqigao_old的文件状态
>>> os.stat("zhangqigao_old")
posix.stat_result(st_mode=33261, st_ino=76808195, st_dev=2053L, st_nlink=1,
st_uid=101, st_gid=103, st_size=0, st_atime=1491035188, st_mtime=1491035188,
st_ctime=1491035242)
#拷贝zhangqigao_old 文件状态给zhangqigao 文件
>>> shutil.copystat("zhangqigao_old","zhangqigao")
# 拷贝后,zhangqigao文件的文件状态
>>> os.stat("zhangqigao")
posix.stat_result(st_mode=33261, st_ino=76808194, st_dev=2053L, st_nlink=1,
st_uid=0, st_gid=0, st_size=0, st_atime=1491035188, st_mtime=1491035188,
st_ctime=1491039237)#操作后两个文件比较
[root@jenkins_sh temp]# ll
total 0
-rwxr-xr-x 1 root root 0 Apr 1 16:26 zhangqigao #状态包括文件权限,文件创建的时间等,不包括文件所属用户和用户组
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
5、shutil.copy(src, dst)
功能:拷贝文件和文件的权限
#拷贝前
[root@jenkins_sh temp]# ll
total 0
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
#拷贝中
>>> import os,shutil
>>> os.chdir("/temp")
>>> shutil.copy("zhangqigao_old","zhangqigao")
#拷贝结果输出
[root@jenkins_sh temp]# ll
total 0
-rwxr-xr-x 1 root root 0 Apr 1 17:42 zhangqigao #拷贝了zhangqigao_old文件和文件权限
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
6、shutil.copy2(src, dst)
功能:拷贝文件和文件的状态
#拷贝前
[root@jenkins_sh temp]# ll
total 0
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
#拷贝中
>>> import os,shutil
>>> os.chdir("/temp")
>>> shutil.copy2("zhangqigao_old","zhangqigao")
#拷贝后
[root@jenkins_sh temp]# ll
total 0
-rwxr-xr-x 1 root root 0 Apr 1 16:26 zhangqigao #拷贝了zhangqigao_old的文件和状态
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
7、shutil.copytree(src, dst)
功能:递归的去拷贝文件,相当于cp -r
#操作前
[root@jenkins_sh temp]# ll
total 4
drwxr-xr-x 2 root root 4096 Apr 1 17:53 xiaogao
[root@jenkins_sh temp]# cd xiaogao/;ll
total 0
-rwxr-xr-x 1 root root 0 Apr 1 16:26 zhangqigao
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
#操作中
>>> import os,shutil
>>> os.chdir("/temp")
>>> shutil.copytree("xiaogao","gaogao") #递归拷贝
#操作结果
[root@jenkins_sh temp]# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 1 17:53 gaogao #拷贝成功
drwxr-xr-x 2 root root 4096 Apr 1 17:53 xiaogao
[root@jenkins_sh temp]# cd gaogao/;ll
total 0
-rwxr-xr-x 1 root root 0 Apr 1 16:26 zhangqigao
-rwxr-xr-x 1 root root 0 Apr 1 16:26 zhangqigao_old
9、shutil.rmtree(path[, ignore_errors[, onerror]])
功能:递归的去删除文件,相当于:rm -fr
#操作前
[root@jenkins_sh temp]# ll
total 4
drwxr-xr-x 2 root root 4096 Apr 1 17:53 xiaogao
[root@jenkins_sh temp]# cd xiaogao/;ll
total 0
-rwxr-xr-x 1 root root 0 Apr 1 16:26 zhangqigao
-rwxr-xr-x 1 jenkins jenkins 0 Apr 1 16:26 zhangqigao_old
#操作中
>>> import os,shutil
>>> os.chdir("/temp")
>>> shutil.rmtree("xiaogao")
#操作结果
[root@jenkins_sh temp]# ll
total 0 #成功删除xiaogao目录
10、shutil.move(src, dst)
功能:递归的去移动文件 相当于:mv
#操作前
[root@jenkins_sh temp]# ll
total 4
drwxr-xr-x 2 root root 4096 Apr 1 18:07 xiaogao
-rw-r--r-- 1 root root 0 Apr 1 18:07 zhangqigao
#操作中
>>> import shutil
>>> shutil.move("/temp/zhangqigao","/temp/xiaogao") #把文件移到目录中
#操作结果
[root@jenkins_sh xiaogao]# ll
total 4
drwxr-xr-x 2 root root 4096 Apr 1 18:08 xiaogao
[root@jenkins_sh temp]# cd xiaogao/;ll
total 0
-rw-r--r-- 1 root root 0 Apr 1 18:07 zhangqigao
三、压缩解压缩
1、shutil.make_archive((base_name, format, root_dir=None,base_dir=None,verbose=0,dry=0,owner=None,group=None,logger=None)
功能:创建压缩包并且返回文件路径,例如:zip,tar
- base_name : 压缩包的文件名,也可以是压缩包的路径。只是文件名,则保存当前目录,否则保存到指定路径。
- format:压缩包种类,'zip','tar','bztar','gztar'
- root_dir:需要压缩的文件夹路径(默认当前路径)
- owner:用户,默认当前用户
- group:组,默认当前组
- logger:用于记录日志,通常是logging.Logger对象
#指定路径
>>> import shutil
#把/temp下的xiaogao文件以zip压缩格式压缩,并且存放在/temp/zhangqigao目录下,"/temp/zhangqigao/xiaogao" 中的xiaogao是压缩名
>>> shutil.make_archive("/temp/zhangqigao/xiaogao",'zip',"/temp/xiaogao")
'/temp/zhangqigao/xiaogao.zip' #压缩结果
#默认当前路径
>>> shutil.make_archive("xiaogao",'zip',"/temp/xiaogao")
'/temp/xiaogao.zip'
2、zipfile
功能:以zip的形式压缩文件,注意了这个只能压缩文件,不能压缩目录,如果压缩,也只能显示空目录。
import zipfile# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log') #写入
z.write('data.data')
z.close() #关闭# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall() #解压
z.close()
3、tarfile
功能:以tar的形式打包文件,这边能打包所以文件,包括目录
import tarfile# 打包
tar = tarfile.open('your.tar','w')#不加arcname打的是绝对路径,也就是/Users/wupeiqi/PycharmProjects/bbs2.zip,加这个表示你在your.tar中加什么文件就写什么文件名,也就是bbs2.zip
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
tar.close()# 解压
tar = tarfile.open('your.tar','r')
tar.extractall() # 可设置解压地址
tar.close()
小结:
- tar打包不会压缩文件,所以文件的大小没有变
- zip才会压缩,所以压缩后的文件大小会变小
- 一般情况下是先打包再压缩