Python os 與 shutil 檔案與目錄操作

在進行系統自動化、檔案整理或資料處理時,時常需要與作業系統進行互動。Python 內建的 osshutil 模組提供了完整的工具列,讓我們可以輕鬆處理檔案與目錄。

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 來組合路徑,避免手動拼接 /\ 導致的跨平台問題。