本节内容

  1. 简书
  2. 模块详解
  3. 压缩解压

一、简述

  我们在日常处理文件时,经常用到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-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-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-1 root    root    0 Apr  1 16:26 zhangqigao  #状态包括文件权限,文件创建的时间等,不包括文件所属用户和用户组
-rwxr-xr-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-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-1 root    root    0 Apr  1 17:42 zhangqigao  #拷贝了zhangqigao_old文件和文件权限
-rwxr-xr-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-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-1 root    root    0 Apr  1 16:26 zhangqigao  #拷贝了zhangqigao_old的文件和状态
-rwxr-xr-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-2 root root 4096 Apr  1 17:53 xiaogao
[root@jenkins_sh temp]# cd xiaogao/;ll
total 0
-rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao
-rwxr-xr-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-2 root root 4096 Apr  1 17:53 gaogao   #拷贝成功
drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao
[root@jenkins_sh temp]# cd gaogao/;ll
total 0
-rwxr-xr-1 root root 0 Apr  1 16:26 zhangqigao
-rwxr-xr-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-2 root root 4096 Apr  1 17:53 xiaogao
[root@jenkins_sh temp]# cd xiaogao/;ll
total 0
-rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao
-rwxr-xr-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-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-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
 
# 压缩
= zipfile.ZipFile('laxi.zip''w')
z.write('a.log')  #写入
z.write('data.data')
z.close()   #关闭
 
# 解压
= 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()

 小结:

  1. tar打包不会压缩文件,所以文件的大小没有变
  2. zip才会压缩,所以压缩后的文件大小会变小
  3. 一般情况下是先打包再压缩

函数和常用模块【day06】:shutil模块(四)的更多相关文章

  1. python常用模块之shutil模块

    python常用模块之shutil模块 shutil模块,高级的文件.文件夹.压缩包处理模块 1.shutil.copyfile(src,des[,length]):将文件内容拷贝到另一个文件 In ...

  2. [转]python中对文件、文件夹的操作——os模块和shutil模块常用说明

    转至:http://l90z11.blog.163.com/blog/static/187389042201312153318389/ python中对文件.文件夹的操作需要涉及到os模块和shuti ...

  3. os模块和shutil模块

    # coding=utf-8 import os path="D:\\test" ######### 目录结构如下 # test # / \ \ \ # test01 test02 ...

  4. 元数据的概念以及相关的操作os模块、shutil模块

    查看文件的元数据 stat [OPTION]… FILE… OPTION: -f 输出文件系统的状态,而非文件的状态 -t 显示简要格式的文件元数据信息 FILE:可同时查看多个文件的元数据信息,多个 ...

  5. os模块、os.path模块、shutil模块、configparser模块、subprocess模块

    一.os模块 os指的是操作系统 该模块主要用于处理与操作系统相关的操作,常用的是文件操作(读.写.删.复制.重命名). os.getcwd()  获取当前文件所在的文件夹路径 os.chdir()  ...

  6. Python进阶5---StringIO和BytesIO、路径操作、OS模块、shutil模块

    StringIO StringIO操作 BytesIO BytesIO操作 file-like对象 路径操作 路径操作模块 3.4版本之前:os.path模块 3.4版本开始 建议使用pathlib模 ...

  7. (汇总)os模块以及shutil模块对文件的操作

    ''' # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux ...

  8. python 之 random 模块、 shutil 模块、shelve模块、 xml模块

    6.12 random 模块 print(random.random()) (0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) [1,3] 大 ...

  9. logging模块、shutil模块、subprocess模块、xml模块

    logging模块 shutil模块 subprocess模块 xml模块 logging模块 函数式简单配置 import logging logging.debug('debug message' ...

  10. Python入门-模块2(sys模块、shutil 模块)

    sys模块: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 s ...

随机推荐

  1. Java 中的 try catch 影响性能吗?

    前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...

  2. 面向对象第一次练手-------ArrayList集合、类、对象、冒泡排序、类型转换

    思维转不过弯儿来  怎么做都是错      哪怕差一个()就成功的事情,也是千差万别 忽然想到一句话:差一步就成功的距离  =  差几万米就成功的距离 部分的理解和都体现在代码和注释里 using S ...

  3. Zookeeper 通知更新可靠吗? 解读源码找答案!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由特鲁门发表于云+社区专栏 导读: 遇到Keepper通知更新无法收到的问题,思考节点变更通知的可靠性,通过阅读源码解析了解到zk Wa ...

  4. 在WebGL场景中建立游戏规则

    在前三篇文章的基础上,为基于Babylon.js的WebGL场景添加了类似战棋游戏的基本操作流程,包括从手中选择单位放入棋盘.显示单位具有的技能.选择技能.不同单位通过技能进行交互.处理交互结果以及进 ...

  5. MongoDB 安装教程

    前言: MongoDB是一个基于分布式文件存储的数据库.由C++旨在为WEB应用提供可扩展的高性能数据存储解决方案. 官方网站:https://www.mongodb.com/ 本次教程只针对wind ...

  6. (第十二周)Bug修正报告

    根据Debug周各组找出的Bug,现做出如下说明: Bug: 一.天天向上团队 看到的现象:当食物链长度很长时,最长链显示不全.如下图: 期待的现象:当食物链过长时,食物链可以自动换行. 二者的差异: ...

  7. RYU 灭龙战 third day

    RYU 灭龙战 third day 前言 传统的交换机有自学习能力.然而你知道在SDN的世界里,脑子空空的OpenFlow交换机是如何学习的吗?今日说法带你领略SDN的mac学习能力. RYUBook ...

  8. Spark 实践——基于 Spark Streaming 的实时日志分析系统

    本文基于<Spark 最佳实践>第6章 Spark 流式计算. 我们知道网站用户访问流量是不间断的,基于网站的访问日志,即 Web log 分析是典型的流式实时计算应用场景.比如百度统计, ...

  9. 开源通用爬虫框架YayCrawler-运行与调试

    本节我将向大家介绍如何运行与调试YayCrawler.该框架是采用SpringBoot开发的,所以可以通过java –jar  xxxx.jar的方式运行,也可以部署在tomcat等容器中运行. 首先 ...

  10. 关于vue-eslint自动补全代码,以及自动生成雪碧图

    一.配置eslint module.exports={ "printWidth": 240, //一行的字符数,如果超过会进行换行,默认为80 "tabWidth&quo ...