自動整理檔案時,常會需要複製、搬移、建立目錄或刪除檔案。這篇依 shutil 與 os 的用途整理範例,讓每個操作都能獨立查閱;執行前先確認來源與目的路徑。
- 用 shutil 複製與搬移檔案或資料夾
- 用 os 建立目錄、檢查路徑與刪除檔案
- 用測試資料確認操作結果,再套用到實際檔案
原始實作記錄於 2020 年;以下操作畫面與程式範例保留當時版本。
shutil 與 os 都是 Python 標準函式庫,可直接 import,不需要另外用 pip 安裝。下列舊版安裝範例僅保留作為原始紀錄。查閱 Python 文件
以下先介紹 shutil 的高階檔案操作,再整理 os 的路徑與目錄功能。範例中的 test 名稱可自行替換,執行前要先辨認來源、目的地與目前工作目錄。
shutil模組
copytree 用於整個目錄樹;copyfile 用於檔案內容;copy 也會複製檔案權限,copy2 則盡可能保留更多中繼資料。下方 copy 範例的舊註解把來源寫成目錄,正確來源應是檔案。
- 原始安裝紀錄(標準函式庫不需執行):
1
pip install pytest-shutil
複製整個資料夾樹狀結構至新資料夾
1
2
3shutil.copytree('A','B')
# A和B都可能是目錄位置,但B必須為不存在
# shutil.copytree會自動產生B目錄,如果B目錄存在會出現錯誤訊息。- 參考寫法
1
2import shutil
shutil.copytree('./test1/','D:/test2/')
- 參考寫法
刪除資料夾與其中全部內容
1
2import shutil
shutil.rmtree('./test/')複製單一檔案
1
2
3import shutil
shutil.copyfile('A','B')
# A和B只能是檔案,不能是目錄位址- 參考寫法
1
shutil.copyfile('test1.jpg','test2.jpg')
- 參考寫法
將檔案複製到另一個檔名或資料夾
1
2
3import shutil
shutil.copy('A','B')
# A只能是目錄,B可以是目錄或檔案搬移檔案或資料夾
1
2
3import shutil
shutil.move('A','B')
# A可以是目錄或檔案,B只能是目錄
os模組
mkdir 建立單層資料夾;makedirs 可處理多層路徑;remove 刪除檔案。需要刪除整個資料夾時,應使用對應的目錄操作,不能把檔案與資料夾的函式混用。
os 是 Python 標準函式庫,可直接匯入。
刪除單一檔案
1
2import os
os.remove('test.jpg')判斷資料夾(目錄)是否存在
1
2
3import os
if not os.path.isdir('./test/'):
print('資料夾不存在')新增資料夾(單層目錄)
1
2import os
os.mkdir('./test/')新增資料夾(多層目錄)makedirs 可建立多層目錄;當上層 test 尚未存在時,會一併建立。若目標已存在,是否容許重複建立需依參數設定處理。
1
2
3import os
os.makedirs('./test/hello/',exist_ok=True)
# os.makedirs的exist_ok預設為False,如果資料夾存在的話,將會發生錯誤訊息,因此要記得修改為True,無論目錄是否存在,都會自動判斷新增。組合路徑
1
2import os
os.path.join('./test/','hello,jpg')- 原範例組合的路徑為
./test/hello,jpg;逗號來自範例檔名,若要一般 JPG 副檔名,應使用 hello.jpg。路徑分隔符號依作業系統而異。
1
2import os
os.path.join('./testA/','./testB/,'hello.jpg')- 原範例組合的路徑為
./testA/testB/hello.jpg。join 只產生路徑字串,不會建立檔案或目錄;分隔符號會依作業系統而異。
- 原範例組合的路徑為
操作前後要比對什麼
練習時先建立獨立的測試資料夾。複製後確認來源仍在、目的檔案內容相符;搬移後確認新位置與原位置;刪除前確認完整路徑,再檢查操作結果。目的地已存在時,需留意覆寫或例外訊息。
參考:Python shutil 文件。

