• day5-shutil模块


    一、概述

    我们通过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 >>>

    来看下打包的效果:

    imageimage

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


    • 解压

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

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

    解压后的效果:

    image

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

  • 相关阅读:
    opencv之霍夫曼变换
    【Linux】【Jenkins】系统配置报反向代理设置有误问题的解决方案
    【Linux】【Selenium】安装Chrome和ChromeDriver的配置
    【Linux】【Jenkins】编译过程中遇到ERROR: Failed to parse POMs的解决方案
    【Linux】【Jenkins】代码编译和执行过程中的问题汇总
    【Linux】【Jenkins】邮件发送失败的问题javax.mail.MessagingException: Could not connect to SMTP host:
    【Linux】【Jenkins】配置过程中,立即构建时,maven找不到的问题解决方案
    【Linux】【GIt】Linux下安装和配置Git(转)
    【Linux命令】Linux下的tar压缩解压缩命令详解(转)
    【Linux】【Maven】Linux下安装和配置Maven
  • 原文地址:https://www.cnblogs.com/linupython/p/8213265.html
Copyright © 2020-2023  润新知