一、概述

我们通过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. js生成二维码/html2canvas生成屏幕截图

    1.需求简述 (1) 最初需求: 根据后台接口获取url,生成一个二维码,用户可以长按保存为图片.(这时的二维码只是纯黑白像素构成的二维码) 方案1: 使用jquery.qrcode.min.js插件 ...

  2. Vijos p1303导弹拦截(LIS+贪心)

    传送门:https://vijos.org/p/1303 背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题開始训练. 描写叙述 某国为了防御敌国的导弹突击,研发出一种导弹拦截系统. 可是这 ...

  3. PAT 1081 Rational Sum[分子求和][比较]

    1081 Rational Sum (20 分) Given N rational numbers in the form numerator/denominator, you are suppose ...

  4. Hbase 学习笔记1----shell

    Hbase 是一个分布式的.面向列的开源数据库,其实现是建立在google 的bigTable 理论之上,并基于hadoop HDFS文件系统.     Hbase不同于一般的关系型数据库(RDBMS ...

  5. NUnit TestFixtureSetup 和 TestFixtureTearDown

    TestFixtureSetup 和 TestFixtureTearDown 在所有测试开始前(TestFixtureSetup)或结束后(TestFixtureTearDown)运行一 次.记住他只 ...

  6. Tornado的基本知识

    Tornado是FriendReed使用的可扩展的非阻塞式的web服务器及其相关工具的开源版本. 这个框架看起来有些像web.py或者Google的webapp,不过为了能有效利用非阻塞服务器环境,这 ...

  7. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

  8. php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理

    php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理 Joe PHP 2012-01-18 定时任务对于php来说一直都是很多朋友的一个难题,但却很多地方都遇到了.比如说:游戏 ...

  9. SOAPUI 压力测试的指标项说明

      soapUI Pro指标项说明:   Test Step Sets the startup delay for each thread (in milliseconds), setting to ...

  10. POJ 1733 Parity game (带权并查集)

    题意:有序列A[1..N],其元素值为0或1.有M条信息,每条信息表示区间[L,R]中1的个数为偶数或奇数个,但是可能有错误的信息.求最多满足前多少条信息. 分析:区间统计的带权并查集,只是本题中路径 ...