iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Software Development

跟著 OXXO 一起學 Python系列 第 46

( Day 22.1 ) Python 高階檔案操作 shutil

  • 分享至 

  • xImage
  •  

Python 的標準函式「shutil」提供了一系列高階操作檔案與資料夾的方法,可以針對檔案進行複製、移動、壓縮、解壓縮等相關操作,這篇教學將會介紹 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)   # 複製權限資訊

Python 教學 - 高階檔案操作 shutil

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)   # 複製權限資訊、修改時間...等資訊

Python 教學 - 高階檔案操作 shutil

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")

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 21.2 ) Python 查找匹配檔案 glob
下一篇
( Day 22.2 ) Python 壓縮檔案 zipfile
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言