高階檔案操作 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")
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~