函数和常用模块【day06】:shutil模块(四)
本节内容
- 简书
- 模块详解
- 压缩解压
一、简述
我们在日常处理文件时,经常用到os模块,但是有的时候你会发现,像拷贝、删除、打包、压缩等文件操作,在os模块中没有对应的函数去操作,下面我们就来讲讲高级的 文件、文件夹、压缩包 处理模块:shutil
二、模块详解
1、shutil.copyfileobj(fsrc, fdst)
功能:把一个文件的内容拷贝到另外一个文件中,可以是部分文件内容。
1
2
3
|
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)
功能:拷贝文件,但是不拷贝所有权限
1
2
|
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)
功能:拷贝文件的文件权限
1
2
3
4
5
6
7
8
9
10
11
12
|
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#两个文件的创建时间和用户权限都不同 [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)
功能:拷贝文件和文件的权限
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#拷贝前 [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)
功能:拷贝文件和文件的状态
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#拷贝前 [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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#操作前 [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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#操作前 [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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#操作前 [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对象
1
1
2
3
4
5
6
7
8
|
#指定路径 >>> 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的形式压缩文件,注意了这个只能压缩文件,不能压缩目录,如果压缩,也只能显示空目录。
1
2
3
4
5
6
7
8
9
10
11
12
|
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的形式打包文件,这边能打包所以文件,包括目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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才会压缩,所以压缩后的文件大小会变小
- 一般情况下是先打包再压缩
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。