一、概述

我们通过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. git 设置 .gitignore 为全局global + 配置.gitignore为全局后不生效解决办法

    outline 什么是 .gitignore 以及 .gitignore 的作用,这里不做赘述,自行网上查阅. 设置 .gitignore 为全局生效 懒得自己逐行敲忽略规则的话,建议移步:https ...

  2. ununtu16.04+python3+selenium+firefox环境搭建

    一.初始配置: 1.安装完系统并配置好地址及DNS.2.设置root密码: sudo passwd root 3.更改云源: sudo cp /etc/apt/sources.list /etc/ap ...

  3. Python框架之Tornado(请求阶段)

    上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) 简而 ...

  4. PHP范例注册审核

    <body> <h1>注册</h1> <form action="zcchuli.php" method="post" ...

  5. 杭电1027Ignatius and the Princess II模拟

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1027 题目: Problem Description Now our hero finds the doo ...

  6. python2.7中的字符编码问题

    0. 写在前面 起因:之前写个数据预处理程序的时候遇到了点问题,用re模块的正则查找方法search时总是找不出来(找错了或者出乱码),于是捣鼓捣鼓. 经过:查资料,做实验,发现用utf8编码的str ...

  7. Linux——网络配置及命令

    traceroute命令(unix)/tracert命令(windows) tracert命令的格式为:tracert [-d] [-h maximum_hops] [-j host-list] [- ...

  8. gh-ost原理

    gh-ost原理 一.三种模式架构图 1.连上从库,在主库上修改 这是gh-ost默认的工作模式,它会查看从库情况,找到集群的主库并且连接上去,对主库侵入最少,大体步骤是: 在主库上创建_xxx_gh ...

  9. Python学习笔记之Python的enumerate函数

    Python 的 enumerate() 函数就像是一个神秘的黑箱,你无法简单地用一句话来概括这个函数的作用与用法. enumerate() 函数属于非常有用的高级用法,而对于这一点,很多初学者甚至中 ...

  10. P4949 最短距离(基环树+树链剖分)

    题目 P4949 最短距离 做法 先把非树边提出来 查询\((x,y)\)的最短距离就分类查询:树上\((x,y)\)距离,经过非树边距离 带边权查询链长,一个烂大街的套路:树链剖分,节点维护树边距离 ...