Python os 與 shutil 檔案與目錄操作
在進行系統自動化、檔案整理或資料處理時,時常需要與作業系統進行互動。Python 內建的 os 與 shutil 模組提供了完整的工具列,讓我們可以輕鬆處理檔案與目錄。
os 模組:作業系統介面
os 模組主要用於處理路徑、檢查檔案狀態以及執行作業系統層級的任務。
常用目錄操作
import os
# 取得目前工作目錄 (Current Working Directory)
cwd = os.getcwd()
print(f"目前目錄: {cwd}")
# 列出目錄下的所有檔案與子目錄
files = os.listdir('.')
print(f"目錄內容: {files}")
# 建立單層目錄
if not os.path.exists('test_dir'):
os.mkdir('test_dir')
# 建立多層目錄 (會自動建立中間缺失的目錄)
os.makedirs('path/to/nested/directory', exist_ok=True)
# 刪除空目錄
# os.rmdir('test_dir')
常用路徑處理 (os.path)
處理路徑時,建議使用 os.path 以確保在不同作業系統(Windows 與 macOS/Linux)上的相容性。
import os
path = "data/users.json"
# 取得檔案名稱
print(os.path.basename(path)) # users.json
# 取得目錄名稱
print(os.path.dirname(path)) # data
# 合併路徑 (最常用!)
full_path = os.path.join("home", "user", "documents")
print(full_path) # home/user/documents (macOS/Linux) 或 home\user\documents (Windows)
# 檢查路徑性質
print(os.path.exists(path)) # 路徑是否存在
print(os.path.isfile(path)) # 是否為檔案
print(os.path.isdir(path)) # 是否為目錄
shutil 模組:高階檔案操作
雖然 os 可以刪除檔案,但對於「複製檔案」或「刪除包含內容的目錄」,shutil 是更強大的選擇。
複製與移動
import shutil
# 複製檔案 (保留權限)
shutil.copy('source.txt', 'destination.txt')
# 複製整個目錄 (包含裡面的所有檔案與子目錄)
shutil.copytree('source_dir', 'backup_dir', dirs_exist_ok=True)
# 移動檔案或重命名
shutil.move('old_name.txt', 'new_folder/new_name.txt')
刪除與封裝
shutil.rmtree() 會永久刪除整個目錄及其所有內容,且無法撤銷,使用時請務必小心。import shutil
# 強制刪除整個目錄 (不論是否為空)
# shutil.rmtree('test_dir')
# 建立壓縮檔 (zip, tar 等)
shutil.make_archive('data_backup', 'zip', 'data_folder')
實務範例:自動化檔案分類
假設我們想將當前目錄下的 .jpg 檔案全部移到一個名為 photos 的資料夾中:
import os
import shutil
def organize_photos(folder='.'):
target_dir = os.path.join(folder, 'photos')
# 1. 確保目標資料夾存在
if not os.path.exists(target_dir):
os.makedirs(target_dir)
print(f"建立目錄: {target_dir}")
# 2. 遍歷檔案
for filename in os.listdir(folder):
if filename.lower().endswith('.jpg'):
src = os.path.join(folder, filename)
dst = os.path.join(target_dir, filename)
# 3. 移動檔案
shutil.move(src, dst)
print(f"已移動: {filename} -> {target_dir}")
# 執行
# organize_photos()
總結
os適合用於路徑處理 (os.path)、環境變數查詢與基本目錄建立。shutil適合用於高效的複製、移動與整個目錄樹的刪除。- 始終使用
os.path.join來組合路徑,避免手動拼接/或\導致的跨平台問題。