当前位置: 首页 > news >正文

shutil模块

shutil模块

文章目录

  • shutil模块
    • 引入
      • 什么是shutil模块
    • 一、shutil 模块的常用方法介绍
      • 1.copyfileobj( )
      • 2.copyfile( )
      • 3.copymode( )
      • 4.copystat( )
      • 5.copy( )
      • 6.copy2( )
      • 7.copytree( )
      • 8.rmtree( )
      • 9.move( )
      • 10.make_archive( )

引入

什么是shutil模块

  • shutil 模块是 Python 的内置模块 : 高级的文件操作模块
  • 用于文件, 文件夹, 压缩包处理, 也主要用于文件的拷贝

一、shutil 模块的常用方法介绍

1.copyfileobj( )

  • 用法:shutil.copyfileobj([file1],[file2])

  • 将文件1 的数据覆盖给 文件2

    import shutil
    
    # test.txt 文件内容 "i am f1, taoxiaoxin"
    with open("test.txt","rt",encoding="utf-8")as f1,\
        open("test2.txt","w+t",encoding="utf-8")as f2:
    
        shutil.copyfileobj(f1,f2)
        f2.seek(0)
        print(f2.read())  # i am f1, taoxiaoxin
    
    

2.copyfile( )

  • 用法 : shutil.copyofile([文件名1],[文件名2])

  • 不用打开文件, 直接用文件名进行覆盖拷贝 (目标文件不需要存在)

    import shutil
    
    shutil.copyfile("test.txt", "test3.txt")
    print(open("test3.txt").read())  # i am f1, taoxiaoxin
    
    

3.copymode( )

  • 用法 :shutil.copymode([文件1],[文件2])

  • 只拷贝文件的权限, 而内容、組、用户均不改变 (目标文件必须存在)

  • ps : os.stat : 获取文件属性

    import os
    
    print(os.stat("test.txt"))  # 获取到一个类似于元组,可索引取值
    '''
    os.stat_result(st_mode=33060, st_ino=8444249301325069,st_dev=1317905668,\
    st_nlink=1,st_uid=0, st_gid=0, st_size=15, st_atime=1608454814, \
    st_mtime=1608454076, st_ctime=1608453477)
    '''
    
    import shutil, os
    
    print(os.stat("test.txt")[0])  # 33206 (取到的是"test"的权限)
    print(os.stat("test3.txt")[0])  # 33206 ("test3"的权限)
    
    shutil.copymode("test.txt", "test3.txt")  # 将"test"的权限覆盖给"test3"
    print(os.stat("test3.txt")[0])  # 33206 (再次查看发现已经改变)
    
    

4.copystat( )

  • 用法 : shutil.copystat([文件1],[文件2])

  • 只拷贝文件的状态信息, 包括 : mode bits, atime, mtime, flags (目标文件必须存在)

  • 示例 : 以 atimemtime 的变化来做演示

    import shutil,os
    
    f = open("test5.txt","w")     # 创建一个新文件
    
    res = os.stat("test.txt")
    res2 = os.stat("test5.txt")
    print(res[-3],res[-2])       # 1610202192 1610202192 (atime,mtime)
    print(res2[-3],res2[-2])     # 1610205015 1610205015
    
    shutil.copystat("test.txt","test5.txt")  # 进行状态信息拷贝
    
    res3 = os.stat("test.txt")
    res4 = os.stat("test5.txt")
    print(res3[-3],res3[-2])     # 1610202192 1610202192
    print(res4[-3],res4[-2])     # 1610202192 1610202192 (可以发现一样了)
    

5.copy( )

  • 用法 : shutil.copy([文件1],[文件2])

  • 文件和权限都进行拷贝

    import shutil
    
    print(open("test.txt","r").read())   # i am test
    print(open("test5.txt","r").read())  # i am test5
    
    shutil.copy("test.txt","test5.txt")
    
    print(open("test.txt","r").read())  # i am test
    print(open("test5.txt","r").read()) # i am test
    

6.copy2( )

  • 用法 : shutil.copy2([文件1],[文件2])

  • 文件和状态信息进行拷贝

    import shutil
    
    shutil.copy2("test.txt","test2.txt")
    

7.copytree( )

  • shutil.copytree([源目录],[目标目录],symlinks=False,ignore=None)
  • shutil.ignore_patterns([需要排除的文件])
  • 递归的去拷贝文件夹, 目标目录必须不能存在, 并且需要对源目录的父目录主要有可写权限
  • ignone 指的是要排除的文件, symlinks 指的是将软连接拷贝成硬链接, 默认False
  • ps : os.liatdir( ) : 获取指定目录下的子文件及子目录
import shutil,os

print(os.listdir("./aaa"))  # ['111.txt', '222.txt', '333.txt', '444.txt']

shutil.copytree("aaa","bbb",ignore=shutil.ignore_patterns("222.txt"))  # 排除"222.txt"

print(os.listdir("./bbb"))  # ['111.txt', '333.txt', '444.txt']

8.rmtree( )

  • 用法 : shutil.rmtree([目标目录])
  • 递归删除目录下的目录和文件
import shutil,os

print(os.listdir("./bbb"))      # ['ccc']
print(os.listdir("./bbb/ccc"))  # ['bbb.txt', 'dddd', 'test5.txt']

shutil.rmtree("./bbb/ccc")

print(os.listdir("./bbb"))      # [] ("ccc"已经被删除)

9.move( )

  • 用法 : shutil.move([源文件],[指定路径])

  • 递归的移动文件, 类似于 mv 命令, 其实就是重命名

    import shutil,os
    
    print(os.listdir("./aaa"))   # ['111.txt', '222.txt', '333.txt', 'ccc']
    
    shutil.move("./aaa","./bbb")
    
    print(os.listdir("./bbb"))   # ['111.txt', '222.txt', '333.txt', 'ccc']
    

10.make_archive( )

  • 用法 : shutil.make_archive([base_name],[format],[root_dir],....)
  • 创建压缩包并返回文件路径
  • 参数:
参数说明
base_name压缩包路径及名字 (只写名字默认保存在当前目录)
format压缩包类型 : “zip” “tar” “bztar” “gztar”
root_dir要压缩的文件夹路径 (默认当前路径)
owner用户 (默认是当前用户)
group组 (默认是当前组)
logger用于记录日志 (通常是logger.Logger对象)
import shutil,os

print(os.listdir("./bbb"))  # ['ccc']

shutil.make_archive("./bbb/shawn","tar",root_dir="./bbb/ccc")

print(os.listdir("./bbb"))  # ['ccc', 'shawn.tar']
  • shutil 对压缩包的处理实际上是调用了 ZipFileTarFile 这两个模块 :

    • zipfile 模块

      import zipfile,os
      
      # 压缩
      import zipfile
      
      z = zipfile.ZipFile("shawn.zip","w")
      z.write("./bbb")            # 将"bbb"这个目录加入压缩包
      z.write("./ttt.txt")        # 将"ttt.txt"加入压缩包
      z.close()
      
      print(os.listdir("./"))     # ['bbb', 'ccc', 'shawn.zip', 'ttt.txt']
      
      # 解压
      z = zipfile.ZipFile("shawn.zip","r")
      z.extractall(path="./ccc")  # 解压到 "./ccc" 中
      z.close()
      
      print(os.listdir("./ccc"))  # ['bbb', 'ttt.txt']
      
    • tarfile 模块

      import tarfile,os
      
      # 压缩
      t = tarfile.open("./song.tar","w")
      t.add("./bbb",arcname="bbb.bak")      # 将"bbb"这个目录加入压缩包
      t.add("./ttt.txt",arcname="ttt.bak")  # # 将"ttt.txt"加入压缩包
      t.close()
      
      print(os.listdir("./"))     # ['bbb', 'ccc', 'song.tar', 'ttt.txt']
      
      # 解压
      t = tarfile.open("./song.tar","r")
      t.extractall("./ccc")       # 解压到 "./ccc" 中
      t.close()
      
      print(os.listdir("./ccc"))  # ['bbb.bak', 'ttt.bak']
      

相关文章:

  • shelve 模块
  • typing模块
  • 压缩zipfile与解压缩tarfile模块
  • pyecharts 模块的简单使用
  • hashlib 与 hmac 模块
  • python之包
  • python之logging模块详解
  • logging模块基本介绍及使用
  • 面向对象的由来
  • python之面向对象编程
  • 类的封装
  • 类的多继承下的菱形问题
  • 类的派生
  • 类的多态与鸭子类型
  • 绑定方法与非绑定方法
  • android 一些 utils
  • CSS3 变换
  • Hibernate【inverse和cascade属性】知识要点
  • Kibana配置logstash,报表一体化
  • KMP算法及优化
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • magento 货币换算
  • Python学习之路13-记分
  • Zepto.js源码学习之二
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 给初学者:JavaScript 中数组操作注意点
  • 后端_ThinkPHP5
  • 全栈开发——Linux
  • 人脸识别最新开发经验demo
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一个项目push到多个远程Git仓库
  • 源码安装memcached和php memcache扩展
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​io --- 处理流的核心工具​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #include<初见C语言之指针(5)>
  • #Z2294. 打印树的直径
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (理论篇)httpmoudle和httphandler一览
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • ./和../以及/和~之间的区别
  • .cfg\.dat\.mak(持续补充)
  • .NET BackgroundWorker
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net core 6.0 升8.0
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置