一、概述

我们通过python操作文件时,除正常读写操作外,有时还需要进行拷贝、删除、打包等操作,虽然os模块提供了部分功能,但还是不够完善,这里要讲讲专业的高级的文件,文件夹,压缩包处理模块shutil了。

二、shutil模块常见用法

  • shutil.copyfileobj(fsrc, fdst,length)
    将源文件内容拷贝到目标文件中,因此涉及到文件的读写操作。查阅资料显示可以拷贝部分文件内容,具体用法不详,后续再研究把。
      1 import shutil
    2 with open('./binlog.log', 'r', encoding='utf-8') as f1,\
    3 open('3.txt', 'w', encoding='utf-8') as f2:
    4 shutil.copyfileobj(f1, f2)
  • shutil.copyfile(src, dst)
    拷贝文件对象,但不包括权限
      1 shutil.copyfile('./1.txt','./2.txt')
    2 shutil.copyfile('./1.txt', '../2.txt')
  • shutil.copy(src, dst)
    拷贝文件,包括文件的权限(但不包括所有者属性)
      1 >>> import os,shutil
    2 >>> os.chdir('/root/temp')
    3 >>> shutil.copy('./test.py', './2.py')
    4 >>> quit()
    5 [root@test210 temp]# ls -ltr
    6 total 24
    7 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    8 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    9 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    10 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py
    11 -rw-r--r--. 1 root root 23 Dec 26 07:54 2.py # 拷贝的文件权限与源文件一致,但所有者不同
  • shutil.copymode(src,dst)
    仅仅拷贝文件的权限,前提是dst文件存在,不然会报错
      1 [root@test210 admin]# ls -ltr
    2 total 4
    3 -rwxr-xr-x. 1 admin admin 5 Jan 1 08:06 src_file
    4 -rw-r--r--. 1 root root 0 Jan 1 08:08 dst_file #初始文件权限不同
    5 [root@test210 admin]# python
    6 Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
    7 [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
    8 Type "help", "copyright", "credits" or "license" for more information.
    9 >>> import os,shutil
    10 >>> os.chdir("/home/admin")
    11 >>> shutil.copymode('src_file','dst_file')
    12 >>> quit()
    13 [root@test210 admin]# ls -ltr
    14 total 4
    15 -rwxr-xr-x. 1 admin admin 5 Jan 1 08:06 src_file
    16 -rwxr-xr-x. 1 root root 0 Jan 1 08:08 dst_file #拷贝后文件权限相同
    17 [root@test210 admin]#
  • shutil.copystat(src,dst)
    拷贝文件的属性状态信息,如权限,各种时间,bit,flag等,但不包括所有者和所属组
      1 [root@test210 temp]# ls -ltr
    2 total 24
    3 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    4 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    5 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    6 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py
    7 -rwxr-xr-x. 1 root root 23 Dec 26 07:54 2.py
    8 [root@test210 temp]# python
    9 Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
    10 [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
    11 Type "help", "copyright", "credits" or "license" for more information.
    12 >>> import os,shutil
    13 >>> os.chdir('/root/temp')
    14 >>> os.stat('test.py')
    15 posix.stat_result(st_mode=33188, st_ino=1309341, st_dev=64768L, st_nlink=1, st_uid=500, st_gid=500, st_size=23, st_atime=1514246087, st_mtime=1514245766, st_ctime=1514246037)
    16 >>> os.stat('2.py')
    17 posix.stat_result(st_mode=33261, st_ino=1308211, st_dev=64768L, st_nlink=1, st_uid=0, st_gid=0, st_size=23, st_atime=1514246087, st_mtime=1514246087, st_ctime=1514765789)
    18 >>> shutil.copystat('test.py','2.py')
    19 >>> quit()
    20 [root@test210 temp]# ls -ltr
    21 total 24
    22 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    23 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    24 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    25 -rw-r--r--. 1 root root 23 Dec 26 07:49 2.py
    26 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py #拷贝后2.py和test.py除所有者和所属组不同外,其他常见属性相同
  • shutil.copy2(src,dst)
    拷贝文件和文件的属性状态,目前来看等同于cp -a或cp -p
      1 [root@test210 temp]# ls -ltr
    2 total 24
    3 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    4 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    5 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    6 -rw-r--r--. 1 root root 23 Dec 26 07:49 2.py
    7 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py
    8 [root@test210 temp]#
    9 [root@test210 temp]#
    10 [root@test210 temp]# python
    11 Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
    12 [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
    13 Type "help", "copyright", "credits" or "license" for more information.
    14 >>> import os,shutil
    15 >>> os.chdir('/root/temp')
    16 >>> shutil.copy2('2.py','3.py')
    17 >>> quit()
    18 [root@test210 temp]# ls -ltr
    19 total 28
    20 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    21 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    22 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    23 -rw-r--r--. 1 root root 23 Dec 26 07:49 3.py
    24 -rw-r--r--. 1 root root 23 Dec 26 07:49 2.py
    25 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py
    26 [root@test210 temp]# cp -a 2.py 4.py
    27 [root@test210 temp]# ls -ltr
    28 total 32
    29 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    30 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    31 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    32 -rw-r--r--. 1 root root 23 Dec 26 07:49 4.py
    33 -rw-r--r--. 1 root root 23 Dec 26 07:49 3.py
    34 -rw-r--r--. 1 root root 23 Dec 26 07:49 2.py
    35 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py
    36 [root@test210 temp]# cp -p 2.py 5.py
    37 [root@test210 temp]# ls -ltr
    38 total 36
    39 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    40 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    41 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    42 -rw-r--r--. 1 root root 23 Dec 26 07:49 5.py
    43 -rw-r--r--. 1 root root 23 Dec 26 07:49 4.py
    44 -rw-r--r--. 1 root root 23 Dec 26 07:49 3.py
    45 -rw-r--r--. 1 root root 23 Dec 26 07:49 2.py
    46 -rw-r--r--. 1 admin admin 23 Dec 26 07:49 test.py
  • shutil.copytree(src,dst)
    递归拷贝文件,相当于cp -r
      1 [root@test210 temp]# ls -ltr
    2 total 36
    3 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    4 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    5 [root@test210 temp]# python
    6 Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
    7 [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
    8 Type "help", "copyright", "credits" or "license" for more information.
    9 >>> import os,shutil
    10 >>> os.chdir('/root/temp')
    11 >>> shutil.copytree('01','02')
    12 >>> quit()
    13 [root@test210 temp]# ls -ltr 01 02
    14 02:
    15 total 4
    16 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    17
    18 01:
    19 total 4
    20 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    21 [root@test210 temp]# ls -ltr
    22 total 40
    23 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    24 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 02
    25 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
  • shutil.rmtree(path[, ignore_errors[, onerror]])
    递归删除文件,相当于rm -rf
      1 [root@test210 temp]# ls -ltr
    2 total 40
    3 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    4 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 02
    5 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    6 [root@test210 temp]# pyhon
    7 -bash: pyhon: command not found
    8 [root@test210 temp]# python
    9 Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
    10 [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
    11 Type "help", "copyright", "credits" or "license" for more information.
    12 >>> import os,shutil
    13 >>> os.chdir('/root/temp')
    14 >>> shutil.rmtree('02')
    15 >>> quit()
    16 [root@test210 temp]# ls -ltr
    17 total 36
    18 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    19 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
  • shutil.move(src,dst)
    移动文件,如果是路径则递归移动,相当于mv
      1 [root@test210 temp]# ls -ltr
    2 total 20
    3 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    4 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    5 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip
    6 drwxr-xr-x. 2 root root 4096 Jan 1 08:32 02
    7 [root@test210 temp]# ls -ltr 02
    8 total 0
    9 [root@test210 temp]# python
    10 Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
    11 [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
    12 Type "help", "copyright", "credits" or "license" for more information.
    13 >>> import os,shutil
    14 >>> os.chdir('/root/temp')
    15 >>> shutil.move('dns.zip','02')
    16 >>> shutil.move('01','02')
    17 >>> quit()
    18 [root@test210 temp]# ls -ltr
    19 total 8
    20 drwxr-xr-x. 4 root root 4096 Aug 23 14:21 DNS
    21 drwxr-xr-x. 3 root root 4096 Jan 1 08:34 02
    22 [root@test210 temp]# ls -ltr 02
    23 total 12
    24 drwxr-xr-x. 3 root root 4096 Nov 14 17:37 01
    25 -rw-r--r--. 1 root root 7071 Nov 14 17:40 dns.zip

三、shutil模块常见用法

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 >>> import shutil
    2 >>> shutil.make_archive('jb51.net','zip',"C:/Users/Beyondi/Downloads/jb51.net")
    3 'C:\\Users\\Beyondi\\jb51.net.zip' #压缩包的保存路径是cmd的默认路径
    4 >>>
    5 >>>
    6 >>> shutil.make_archive('C:/Users/Beyondi/Downloads/jb51.net','zip',"C:/Users/Be
    7 yondi/Downloads/jb51.net")
    8 'C:\\Users\\Beyondi\\Downloads\\jb51.net.zip' #指定了路径和文件名
    9 >>> shutil.make_archive('C:/Users/Beyondi/Downloads/','zip',"C:/Users/Beyondi/Do
    10 wnloads/jb51.net")
    11 'C:\\Users\\Beyondi\\Downloads.zip' #仅仅指定路径,最后一级路径就被自动作为压缩包的文件名了
    12 >>>

2. zipfile模块

功能:以zip的形式压缩和解压缩文件,注意了这个只能压缩文件,不能压缩目录,如果压缩,也只能显示空目录。

  1 >>> import zipfile
2 #压缩
3 >>> z=zipfile.ZipFile('test.zip', 'w')
4 >>> z.write('test.txt')
5 >>> z.close()
6
7 #解压缩
8 >>> z=zipfile.ZipFile('test.zip','r')
9 >>> z.extractall()
10 >>> z.close
11
12 #操作方法类似于文件的操作

3. tarfile模块

功能:以tar的形式打包文件,能打包一切形式的文件,包括目录

  • 打包

打包通过tar.add来实现,语法:先以写的方式打开tarfile文件对象,然后是tar.add(‘file’, arcname=’’), 第一个参数是期望打包的文件(可以是目录),第二个参数可选,定义打包文件中被打包文件的名称,如果不写则自动采用第一个参数的文件名,但会去掉根路径(猜测与Linux下的tar类似,防止解压后覆盖根路径下的重要文件)

  1 >>> import tarfile
2 >>> tar = tarfile.open('test.tar','w')
3 >>> tar.add('test.zip')
4 >>> tar.add('C:/Users/Beyondi/Downloads/jb51.net',arcname='jb51.net')
5 >>> tar.add('E:/test/site.yml')
6 >>> tar.close()
7 >>>

来看下打包的效果:

通过上图可看到,没有定义打包文件中的文件名的,文件名就是源文件名,包含绝对路径,但已经去掉了根路径

  • 解压

解压通过tar.extractall() 来实现,可自定义解压后的路径,默认就是当前目录。当然前提是先以读的方式打开tarfile文件对象。

  1 >>> import tarfile
2 >>> tar=tarfile.open('test.tar','r')
3 >>> tar.extractall('tartest') #解压到指定目录下
4 >>> tar.close()

解压后的效果:

可以看到解压后的文件形式与在tar包中直接打开看到的相同。

day5-shutil模块的更多相关文章

  1. 小白的Python之路 day5 shutil模块

    shutil模块 一.主要用途 高级的文件.文件夹.压缩包 等处理模块 二.常用方法详解 1.shutil.copyfileobj(fsrc, fdst) 功能:把一个文件的内容拷贝到另外一个文件中, ...

  2. Day5模块-shutil模块

    参考博客:http://www.cnblogs.com/wupeiqi/articles/4963027.html shutil模块是高级的文件.文件夹.压缩处理的模块.比如文件的copy.压缩等. ...

  3. day5模块学习--shutil模块

    shutil模块 高级的 文件.文件夹.压缩包 处理模块 os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作.比如说:绝对路径,父目录……  但是,os文件的操作 ...

  4. Python学习-day5 常用模块

    day5主要是各种常用模块的学习 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 conf ...

  5. python的shutil模块

    shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 1.复制文件 def copy(src, dst): """Co ...

  6. Python 之路 Day5 - 常用模块学习

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  7. shutil模块

    shutil模块 提供了大量的文件的高级操作,特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 常用方法 shutil.copyfile(src, dst) 复制文件内容(不包含元数据)从 ...

  8. python 学习day5(模块)

    一.模块介绍 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能 ...

  9. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  10. Python中os和shutil模块实用方法集…

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

随机推荐

  1. 洛谷 P4451 [国家集训队]整数的lqp拆分

    洛谷 这个题目是黑题,本来想打表的,但是表调不出来(我逊毙了)! 然后随便打了一个递推,凑出了样例, 竟然. 竟然.. 竟然... A了!!!!!!! 直接:\(f[i]=f[i-1]*2+f[i-2 ...

  2. C++设计模式 -- 解析和实现

    原文地址  http://c.chinaitlab.com/special/sjms/Index.html#a 导航目录 ※ 设计模式解析和实现之一-Factory模式 ※ 设计模式解析和实现之八-C ...

  3. Django框架--路由分配系统

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  4. python通过原生sql查询数据库(共享类库)

    #!/usr/bin/python # -*- coding: UTF-8 -*- """DB共享类库""" # 使用此类,先实例化一个Da ...

  5. Linux(8)- nginx+uWSGI+virtualenv+supervisor 发布web服务器

    一.理论梳理 WSGI是web服务器的网关接口,它是一个规范,描述了web服务器(下图中的WEB server)如何与web应用程序(下图中的Application)通信,以及web应用程序如何链接在 ...

  6. 在Linux下查找文件内容包含某个特定字符串的文件

    如何在Linux下查找文件内容包含某个特定字符串的文件? 我的目录下面有test1和test2两个文件夹,里面都含有很多文件,其中test2里面还包含一个test文件夹 我想请问的是,如何通过查找关键 ...

  7. Git学习笔记-精简版

    注意本文参考廖雪博客: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 一:Git ...

  8. LeetCode:棒球比赛【682】

    LeetCode:棒球比赛[682] 题目描述 你现在是棒球比赛记录员.给定一个字符串列表,每个字符串可以是以下四种类型之一:1.整数(一轮的得分):直接表示您在本轮中获得的积分数.2. " ...

  9. SpringBoot RedisMQ消息队列与发布订阅

    SpringBoot简单整合RedisMQ消息队列和发布订阅 注:RedisMq消息队列使用redis数组实现,leftpush存一,rightpop取一. 1.application.propert ...

  10. python3:利用smtplib库和smtp.qq.com邮件服务器发送邮件

    python3:利用smtplib库和smtp.qq.com邮件服务器发送邮件 使用qq的邮件服务器需要注意的两个地方主要是: 1.协议问题 使用465端口 SSL 协议 2.口令问题 出现SMTPA ...