day5-shutil模块

Posted 里纳斯-派森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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包中直接打开看到的相同。

以上是关于day5-shutil模块的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将 C 代码片段编译到我的 Perl 模块?

CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段

如何将字符串数据从活动发送到片段?

argparse 代码片段只打印部分日志

nodejs常用代码片段

常用python日期日志获取内容循环的代码片段