46 shutil 模块

487次阅读
没有评论

共计 3984 个字符,预计需要花费 10 分钟才能阅读完成。

引入

1. 什么是 shutil 模块

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

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

1.copyfileobj()

  • 用法 : shutil.copyfileobj([file1],[file2])
  • 将文件 1 的数据覆盖给 文件 2
import shutil

# test.txt 文件内容 "i am f1, hahaha"
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, hahaha

2.copyfile()

  • 用法 : shutil.copyofile([文件名 1],[文件名 2])
  • 不用打开文件, 直接用文件名进行覆盖拷贝 (目标文件不需要存在)
import shutil

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

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])   # 33060 (取到的是 "test" 的权限)
print(os.stat("test3.txt")[0])  # 33206 ("test3" 的权限)

shutil.copymode("test.txt","test3.txt")  # 将 "test" 的权限覆盖给 "test3"
print(os.stat("test3.txt")[0])  # 33060 (再次查看发现已经改变)

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])       # 1608458129 1608457525 (atime,mtime)
print(res2[-3],res2[-2])     # 1608458282 1608458282

shutil.copystat("test.txt","test5.txt")  # 进行状态信息拷贝

res3 = os.stat("test.txt")
res4 = os.stat("test5.txt")
print(res3[-3],res3[-2])     # 1608458129 1608457525
print(res4[-3],res4[-2])     # 1608458129 1608457525 (可以发现一样了)

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 模块

```python
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 模块

```python
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']
```

正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计3984字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)