高阶文件操作 shutil
Python 的标准函数“shutil”提供了一系列高阶操作文件与文件夹的方法,可以针对文件进行复制、移动、压缩、解压缩等相关操作,这篇教学将会介绍 shutil 常用的方法。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
如果使用 Colab,需要和 Google 云端硬盘连动,请参考:连动 Google Drive
shutil 常用方法
下方列出几种 shutil 模组常用的方法 ( 参考 Python 官方文件:shutil 高阶文件操作 ):
| 方法 | 参数 | 说明 |
|---|---|---|
| copyfileobj() | fsrc, fdst | 将来源文件的内容,复制到指定文件里。 |
| copyfile() | src, dst | 将来源文件复制到指定的文件夹变成新文件。 |
| copymode() | src, dst | 将来源文件的权限信息,复制到指定的文件。 |
| copy() | src, dst | 将来源文件包含权限信息,复制到指定的文件夹变成新文件。 |
| copystat() | src, dst | 将来源文件的权限信息、修改时间、用户,复制到指定的文件。 |
| copy2() | src, dst | 将来源文件包含权限信息、修改时间、用户,复制到指定的文件夹变成新文件。 |
| move() | src, dst | 将来源文件或文件夹,移动到指定的文件夹内。 |
| copytree() | src, dst... | 将来源文件夹内的所有文件,复制到指定的文件夹。 |
| rmtree(path) | path | 删除指定文件夹以及其所有内容。 |
| make_archive() | base_name, format, base_dir... | 将文件夹或文件压缩为压缩档。 |
| unpack_archive() | file | 将压缩档解压缩。 |
import shutil
要使用 shutil 必须先 import shutil 模组,或使用 from 的方式,单独 import 特定的类型。
import shutil
from shutil import copy
copyfileobj(fsrc, fdst)
shutil.copyfileobj(fsrc, fdst) 可以将来源文件 ( fsrc ) 的内容,复制到指定文件 ( fdst ) 里,下方的例子先使用 open 分别打开两个 txt 文件,来源文件 hello.txt 设定为 r,指定文件 hello2.txt 设定为 a,使用 shutil.copyfileobj 之后,就会将 hello.txt 的内容,复制添加到 hello2.txt 里。( 使用 os.chdir 纯粹只是要修改 Colab 默认执行的路径,参考:os.chdir(path) )
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks')
f1 = open('demo/hello.txt','r') # 開啟為可讀取
f2 = open('demo/hello2.txt','a') # 開啟為可添加
shutil.copyfileobj(f1,f2) # 複製內容
copyfile(src, dst)
shutil.copyfile(src, dst) 可以将来源文件 ( src ) 复制到指定的目录变成新文件 ( dst ),如果遇到同样档名的文件则会直接覆盖,下方的例子会将 hello.txt 复制到 demo2 的文件夹里,变成 hello2.txt 的文件。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 os.chdir 純粹只是要修改 Colab 預設執行的路徑
f1 = 'demo/hello.txt' # 欲複製的檔案
f2 = 'demo2/hello2.txt' # 存檔的位置與檔案名稱
shutil.copyfile(f1,f2) # 複製檔案
copymode(src, dst)
shutil.copymode(src, dst) 可以将来源文件 ( src ) 的“权限信息”,复制到指定的文件 ( dst ),取代指定文件的权限信息 ( 这个功能在 Colab 里看不出来,要实际用本机文件测试 )。
import shutil
f1 = 'demo.txt'
f2 = 'demo2.txt'
shutil.copymode(f1,f2) # 複製權限資訊
copy(src, dst)
shutil.copy(src, dst) 可以将来源文件 ( src ) 包含权限信息,复制到指定的目录变成新文件 ( dst )。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 os.chdir 純粹只是要修改 Colab 預設執行的路徑
f1 = 'demo/demo.txt'
f2 = 'demo2/demo.txt'
shutil.copy(f1,f2) # 將 demo/demo.txt 複製到 demo2 資料夾的 demo.txt
copystat(src, dst)
shutil.copystat(src, dst) 可以将来源文件 ( src ) 的权限信息、修改时间、用户,复制到指定的文件 ( dst ),取代指定文件的权限信息 ( 这个功能在 Colab 里看不出来,要实际用本机文件测试 )。
import shutil
f1 = 'demo.jpg'
f2 = 'demo2.jpg'
shutil.copystat(f1,f2) # 複製權限資訊、修改時間...等資訊
copy2(src, dst)
shutil.copy2(src, dst) 可以将来源文件 ( src ) 包含权限信息,复制到指定的目录变成新文件 ( dst )。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 os.chdir 純粹只是要修改 Colab 預設執行的路徑
f1 = 'demo/demo.txt'
f2 = 'demo2/demo.txt'
shutil.copy2(f1,f2) # 將 demo/demo.txt 複製到 demo2 資料夾的 demo.txt
move(src, dst...)
shutil.move(src, dst) 可以将来源文件或文件夹,移动到指定的文件夹内,如果目标是文件且同样名称,则会覆写该文件,下方的程序执行后,会将 demo 搬移到 demo2 文件夹里。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 os.chdir 純粹只是要修改 Colab 預設執行的路徑
f1 = 'demo'
f2 = 'demo2'
shutil.move(f1,f2)
copytree(src, dst...)
shutil.copytree(src, dst...) 可以将来源文件夹 ( src ) 内的所有文件,复制到指定的文件夹 ( dst ),总共有六个参数可以使用,除了 src 和 dst 之外,其他都可以直接套用默认值:
| 参数 | 说明 |
|---|---|
| src | 来源文件夹 |
| dst | 目标文件夹 |
| ignore | 要忽略的文件,使用 shutil.ignore_patterns,默认 None |
| copy_function | 复制模式,默认 shutil.copy2 |
| ignore_dangling_symlinks | 是否屏蔽符号链接错误,默认 False |
| symlinks | 是否屏蔽不存在路径的错误,默认 False |
下方的例子会在执行后,复制整个 demo 文件夹 ( 略过里头副档名为 .jpg 以及 .png 的文件 ),复制成为 demo2 文件夹。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 使用 os.chdir 純粹只是要修改 Colab 預設執行的路徑
f1 = 'demo'
f2 = 'demo2'
shutil.copytree(f1, f2, ignore=shutil.ignore_patterns('*.jpg', '*.png'))
rmtree(src)
shutil.rmtree(src) 可以删除指定文件夹以及其所有内容,下方的程序码执行后会删除 demo 文件夹以及其所有内容。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks')
f1 = 'demo'
shutil.rmtree(f1)
make_archive(base_name, format, base_dir...)
shutil.make_archive(base_name, format...) 可以将文件夹或文件压缩为压缩档,总共下列几个参数可以使用,除了 base_name、format 和 base_dir 之外,其他都可以直接套用默认值:
| 参数 | 说明 |
|---|---|
| base_name | 压缩后的文件名称 ( 可以使用目录 + 名称 )。 |
| format | 压缩格式,可使用 zip、tar...等。 |
| base_dir | 相对于根目录的目录。 |
| root_dir | 欲压缩的文件根目录,默认为执行程序的目录。 |
| owner | 文件拥有者,系统默认。 |
| group | 文件群,系统默认。 |
| logger | 记录日志,默认 logging.Logger 对象。 |
下方的程序执行后,会将 demo 文件夹内的 test 文件夹压缩,变成 test.zip 放在 demo 文件夹里。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks')
shutil.make_archive('demo/test', 'zip', base_dir="test", root_dir="demo")
unpack_archive(file)
shutil.unpack_archive(file) 可以将指定的压缩档解压缩,有三个参数可以设定,除了 filename 之外,其他都可以套用默认值。
| 参数 | 说明 |
|---|---|
| file | 欲解压缩的文件 ( 路径相对于程序执行的目录 )。 |
| format | 解压缩格式,默认以文件的副档名为主。 |
| extract_dir | 解压缩之后放置的文件目录,默认为程序执行的目录。 |
下方的程序执行后,会将 zip_folder.zip 解压缩,并放到 demo 文件夹里。
import os
import shutil
os.chdir('/content/drive/MyDrive/Colab Notebooks')
shutil.unpack_archive('zip_folder.zip',extract_dir="demo")
微信扫码关注
抖音扫码关注