zoukankan      html  css  js  c++  java
  • 函数和常用模块【day06】:shutil模块(四)

    本节内容

    1. 简书
    2. 模块详解
    3. 压缩解压

    一、简述

      我们在日常处理文件时,经常用到os模块,但是有的时候你会发现,像拷贝、删除、打包、压缩等文件操作,在os模块中没有对应的函数去操作,下面我们就来讲讲高级的 文件、文件夹、压缩包 处理模块:shutil

    二、模块详解

    1、shutil.copyfileobj(fsrc, fdst)

    功能:把一个文件的内容拷贝到另外一个文件中,可以是部分文件内容。

    1
    2
    3
    with open("f_old",'r',encoding="utf-8") as f1,
        open("f_new","w",encoding="utf-8") as f2:
        shutil.copyfileobj(f1,f2)    #拷贝文件的内容

    注:经过试验,目前试验不出可以拷贝部分文件内容,先忘记可以拷贝部分内容把。

    2、shutil.copyfile(src, dst)

    功能:拷贝文件,但是不拷贝所有权限

    1
    2
    shutil.copyfile("f_old","f_new")  #同一目录下拷贝文件
    shutil.copyfile(r'D:PycharmProjectspyhomeworkday5shutil_modeshutil_modf_old',r'd:f_new')    #通过绝对路径拷贝文件

    3、shutil.copymode(src, dst)

    功能:拷贝文件的文件权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@whtest137 ~]# ll
    total 8
    -rwxr-xr-1 root   root   0 Apr  1 16:05 zhangqigao   #有执行权限
    -rw-r--r-- 1 whtest whtest 0 Apr  1 16:06 zhangqigao_old  #没有执行权限
    >>> import os,shutil
    >>> os.chdir("/root")
    #拷贝"zhangqigao_old"权限给"zhangqigao"
    >>> shutil.copymode("zhangqigao_old","zhangqigao"
    [root@whtest137 ~]# ll
    total 8
    -rw-r--r-- 1 root   root   0 Apr  1 16:05 zhangqigao  # 获得跟"zhangqigao_old"一样的文件权限
    -rw-r--r-- 1 whtest whtest 0 Apr  1 16:06 zhangqigao_old

    4、shutil.copystat(src, dst)

    功能:拷贝文件的状态信息,如:mode bits, atime, mtime, flags

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #两个文件的创建时间和用户权限都不同
    [root@jenkins_sh temp]# ll
    total 0
    -rw-r--r-- 1 root    root    0 Apr  1 17:31 zhangqigao
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old
    #python操作
    >>> import os,shutil
    >>> os.chdir("/temp")
    #zhangqigao 这个文件状态
    >>> os.stat("zhangqigao")
    posix.stat_result(st_mode=33188, st_ino=76808194, st_dev=2053L, st_nlink=1,
    st_uid=0, st_gid=0, st_size=0, st_atime=1491039109, st_mtime=1491039109,
    st_ctime=1491039109)
    #zhangqigao_old的文件状态
    >>> os.stat("zhangqigao_old")
    posix.stat_result(st_mode=33261, st_ino=76808195, st_dev=2053L, st_nlink=1,
    st_uid=101, st_gid=103, st_size=0, st_atime=1491035188, st_mtime=1491035188,
    st_ctime=1491035242)
    #拷贝zhangqigao_old 文件状态给zhangqigao 文件
    >>> shutil.copystat("zhangqigao_old","zhangqigao")
    # 拷贝后,zhangqigao文件的文件状态
    >>> os.stat("zhangqigao")
    posix.stat_result(st_mode=33261, st_ino=76808194, st_dev=2053L, st_nlink=1,
    st_uid=0, st_gid=0, st_size=0, st_atime=1491035188, st_mtime=1491035188,
    st_ctime=1491039237)
     
    #操作后两个文件比较
    [root@jenkins_sh temp]# ll
    total 0
    -rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao  #状态包括文件权限,文件创建的时间等,不包括文件所属用户和用户组
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

    5、shutil.copy(src, dst)

    功能:拷贝文件和文件的权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #拷贝前
    [root@jenkins_sh temp]# ll
    total 0
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old
    #拷贝中
    >>> import os,shutil
    >>> os.chdir("/temp")
    >>> shutil.copy("zhangqigao_old","zhangqigao")
    #拷贝结果输出
    [root@jenkins_sh temp]# ll
    total 0
    -rwxr-xr-1 root    root    0 Apr  1 17:42 zhangqigao  #拷贝了zhangqigao_old文件和文件权限
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

    6、shutil.copy2(src, dst)

    功能:拷贝文件和文件的状态

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #拷贝前
    [root@jenkins_sh temp]# ll
    total 0
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old
    #拷贝中
    >>> import os,shutil
    >>> os.chdir("/temp")
    >>> shutil.copy2("zhangqigao_old","zhangqigao")
    #拷贝后
    [root@jenkins_sh temp]# ll
    total 0
    -rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao  #拷贝了zhangqigao_old的文件和状态
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old

    7、shutil.copytree(src, dst)

     功能:递归的去拷贝文件,相当于cp -r

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #操作前
    [root@jenkins_sh temp]# ll
    total 4
    drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao
    [root@jenkins_sh temp]# cd xiaogao/;ll
    total 0
    -rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old
    #操作中
    >>> import os,shutil
    >>> os.chdir("/temp")
    >>> shutil.copytree("xiaogao","gaogao")  #递归拷贝
    #操作结果
    [root@jenkins_sh temp]# ll
    total 8
    drwxr-xr-2 root root 4096 Apr  1 17:53 gaogao   #拷贝成功
    drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao
    [root@jenkins_sh temp]# cd gaogao/;ll
    total 0
    -rwxr-xr-1 root root 0 Apr  1 16:26 zhangqigao
    -rwxr-xr-1 root root 0 Apr  1 16:26 zhangqigao_old

    9、shutil.rmtree(path[, ignore_errors[, onerror]])

    功能:递归的去删除文件,相当于:rm -fr

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #操作前
    [root@jenkins_sh temp]# ll
    total 4
    drwxr-xr-2 root root 4096 Apr  1 17:53 xiaogao
    [root@jenkins_sh temp]# cd xiaogao/;ll
    total 0
    -rwxr-xr-1 root    root    0 Apr  1 16:26 zhangqigao
    -rwxr-xr-1 jenkins jenkins 0 Apr  1 16:26 zhangqigao_old
    #操作中
    >>> import os,shutil
    >>> os.chdir("/temp")
    >>> shutil.rmtree("xiaogao")
    #操作结果
    [root@jenkins_sh temp]# ll
    total 0    #成功删除xiaogao目录

    10、shutil.move(src, dst)

    功能:递归的去移动文件 相当于:mv

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #操作前
    [root@jenkins_sh temp]# ll
    total 4
    drwxr-xr-2 root root 4096 Apr  1 18:07 xiaogao
    -rw-r--r-- 1 root root    0 Apr  1 18:07 zhangqigao
    #操作中
    >>> import shutil
    >>> shutil.move("/temp/zhangqigao","/temp/xiaogao")   #把文件移到目录中
    #操作结果
    [root@jenkins_sh xiaogao]# ll
    total 4
    drwxr-xr-2 root root 4096 Apr  1 18:08 xiaogao
    [root@jenkins_sh temp]# cd xiaogao/;ll
    total 0
    -rw-r--r-- 1 root root 0 Apr  1 18:07 zhangqigao

     三、压缩解压缩

    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
       
    1
    2
    3
    4
    5
    6
    7
    8
    #指定路径
    >>> import shutil
    #把/temp下的xiaogao文件以zip压缩格式压缩,并且存放在/temp/zhangqigao目录下,"/temp/zhangqigao/xiaogao" 中的xiaogao是压缩名
    >>> shutil.make_archive("/temp/zhangqigao/xiaogao",'zip',"/temp/xiaogao")   
    '/temp/zhangqigao/xiaogao.zip'    #压缩结果
    #默认当前路径
    >>> shutil.make_archive("xiaogao",'zip',"/temp/xiaogao")                
    '/temp/xiaogao.zip'

    2、zipfile

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import zipfile
     
    # 压缩
    = zipfile.ZipFile('laxi.zip''w')
    z.write('a.log')  #写入
    z.write('data.data')
    z.close()   #关闭
     
    # 解压
    = zipfile.ZipFile('laxi.zip''r')
    z.extractall()   #解压
    z.close()

    3、tarfile

    功能:以tar的形式打包文件,这边能打包所以文件,包括目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import tarfile
     
    # 打包
    tar = tarfile.open('your.tar','w')
     
    #不加arcname打的是绝对路径,也就是/Users/wupeiqi/PycharmProjects/bbs2.zip,加这个表示你在your.tar中加什么文件就写什么文件名,也就是bbs2.zip
    tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip')
    tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
    tar.close()
     
    # 解压
    tar = tarfile.open('your.tar','r')
    tar.extractall()  # 可设置解压地址
    tar.close()

     小结:

    1. tar打包不会压缩文件,所以文件的大小没有变
    2. zip才会压缩,所以压缩后的文件大小会变小
    3. 一般情况下是先打包再压缩
  • 相关阅读:
    MacOS下保护浏览器主页和默认搜索
    Tokyo Tyrant(TTServer)系列(一)-介绍和安装
    四:二叉树的镜像递归非递归求解
    Android 异常 android.os.NetworkOnMainThreadException
    Android开发学习之路--传感器之初体验
    Xcode真机调试失败:The identity used to sign the executable is no longer valid
    hdu 3068 最长回文(manacher&最长回文子串)
    bzoj1030【JSOI2007】文本生成器
    HDU2082母函数模板题
    Oracle数据库远程连接配置教程
  • 原文地址:https://www.cnblogs.com/luoahong/p/7195983.html
Copyright © 2011-2022 走看看