zoukankan      html  css  js  c++  java
  • day5模块学习--shutil模块

    shutil模块

    高级的 文件、文件夹、压缩包 处理模块

    os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录……  但是,os文件的操作还应该包含移动 复制  打包 压缩 解压等操作,这些os模块都没有提供。
    而本文所讲的shutil则就是对os中文件操作的补充。--移动 复制  打包 压缩 解压。

        1、shutil.copyfileobj(fsrc, fdst[, length])

        import shutil
      f1 = open("alexsb","r",encoding="utf-8")

      f2 = open("文件2","w",encoding='utf-8')
      shutil.copyfileobj(f1,f2)
      f1.close()
      f2.close()
        把一个文件复制到另外一个文件,记得要同时打开两个文件,如果是Windows,要加上encoding="utf-8",以"utf-8"读取和复制。

        2、shutil.copyfile(src, dst)

        源代码:从下面源代码可以看出,copyfile()方法自己打开模块,不需要我们再去打开模块,第一个模块是以"rb"模式打开,第二个模式是以"wb"模式打开,如果文件存在,从冲掉之前文件里面的内容。

    def copyfile(src, dst, *, follow_symlinks=True):
      if _samefile(src, dst):
        raise SameFileError("{!r} and {!r} are the same file".format(src, dst))
      for fn in [src, dst]:
        try:
          st = os.stat(fn)
        except OSError:
          # File most likely does not exist
          pass
        else:
          # XXX What about other special files? (sockets, devices...)
          if stat.S_ISFIFO(st.st_mode):
            raise SpecialFileError("`%s` is a named pipe" % fn)
      if not follow_symlinks and os.path.islink(src):
        os.symlink(os.readlink(src), dst)
      else:
        with open(src, 'rb') as fsrc:
          with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)
      return dst

        import shutil
      shutil.copyfile("文件2","文件3")

        shutil.copyfile("被赋值文件","赋值文件")也是赋值文件,只是不需要打开文件,把一个文件赋值到另外一个文件中,如果这个文件不存在,则新建一个文件。   

        3.shutil.copymode(src, dst)

        仅拷贝权限。内容、组、用户均不变

        def copymode(src,dst):

        '''Copy mode bits from src to dst'''

          if hasattr(os,"chmod"):

          st = os.stat(src)

          mode = stat.S_IMODE(st,st_mode)

          os.chmod(dst,mode)

        在Linux平台上,文件有很多权限,shutil.copymode(src,dst)只让用户copy权限,不复制文件内容。

        4.shutil.copystat(src, dst)

        拷贝状态的信息,包括:mode bits, atime, mtime, flags

        import shutilf1 = open("文件2","rb")
      f2 = open("文件4","wb")
      shutil.copystat("文件2","文件4")

        5.shutil.copy(src, dst)     

        复制文件的内容以及权限,先copyfile后copymode

        6.shutil.copy2(src, dst)

        复制文件的内容以及文件的所有状态信息。先copyfile后copystat  

        7.shutil.ignore_patterns(*patterns)

        8.shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False)

        递归的复制文件内容及状态信息

        shutil.copytree()递归地copy目录和文件,等于复制了一份完全一样的源文件。

        import shutil
        shutil.copytree("copytrees","new_copytrees")

        创建一个一模一样的目录和文件,复制里面所有的内容,这个功能还是很强大的。就相当于直接点击复制粘贴。

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

        递归的去删除文件

        import shutil
      shutil.rmtree("new_copytrees")

        shutil.rmtree(path)是递归的删除文件,即便文件里面有内容也能够删除,我们知道,os.rmdir()如果文件有内容是不能删除的,相比较,系统的功能是强大很多,从底层删除文件。

        10.shutil.move(src, dst)

        递归的去移动文件

        11.shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None)

        创建压缩包并返回文件路径,例如:zip、tar

        (1)base_name:压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

                     如:www     >>保存至当前路径

             如:/users/wupeiqi/www   ==>>保存至/Users/wupeiqi/下面

        (2)format:压缩包种类,"zip","tar","bztar","gztar"

        (3)root_dir:要压缩的文件夹路径(默认当前目录)

        (4)owner:用户,默认当前用户

      (5)logger:用于记录日志,通常是logging.Logger对象

        #将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录

        import shutil
      ret = shutil.make_archive("只能压缩文件", 'gztar', root_dir='/home/zhuzhu/第五天/copytrees')

        #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录  

        import shutil

      ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')

        make_archive()只能压缩目录(directory),不能压缩文件(file)或这.py文件,只能是整体把文件目录进行压缩。

        shutil对文件的压缩是通过调用zipfile和tarfile来进行压缩的。

        zipfile  模块压缩解压

        zipfile能够指定压缩那个目录的文件,就是可以自助定义压缩,也是比较好的,我们可以压缩文件,shutil只能整体压缩目录,而zipfile能够压缩各个文件(File)类型。

        实例如下:

        压缩

        import zipfile
      '''调用zipfile模块,随便压缩问价'''

      z = zipfile.ZipFile("想压谁压谁.zip","w")     #创建一个压缩包
      z.write("/home/zhuzhu/第五天/文件2")          #向压缩包添加压缩文件2
      z.write("/home/zhuzhu/第五天/time_sleep.py")  #向压缩包添加Python脚本time_sleep.py
      z.close()    #关闭压缩文件

        解压

       import zipfile
      '''调用zipfile模块解压文件'''

      z = zipfile.ZipFile("想压谁压谁.zip","r") #解压文件
      z.extractall() #调用extract()解压
      z.close()

       tarfile  模块压缩解压

        tar压缩

        import tarfile

      z = tarfile.open("test.tar","w")
      '''打开压缩文件,如果压缩包不存在,则重新创建,如果存在,则删除里面的内容'''
      z.add("/home/zhuzhu/第五天/文件3") #向压缩包添加压缩文件
      z.add("/home/zhuzhu/第五天/sys_argv.py")
      z.close() #关闭压缩包
        tar解压

        import tarfile
      '''解压文件'''

      z = tarfile.open("test.tar","r")
      z.extractall()
      z.close()

        zipfile和tarfile压缩解压文件。

  • 相关阅读:
    Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) C
    Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1
    引入CSS文件的方式,以及link与@import的区别
    JavaScript
    css
    html
    CentOS 7编译安装Python3.7.X
    python3配置爬虫开发环境
    Threading模块
    队列Queue的get方法
  • 原文地址:https://www.cnblogs.com/gengcx/p/7223763.html
Copyright © 2011-2022 走看看