1. 前言
Python 提供了強大的工具來輕鬆處理文件操作,其中,文件複製是日常任務之一。本文將介紹如何使用 Python 標準庫中的 shutil
模組來高效地複製文件和目錄。我們將提供具體的程式碼範例,並說明如何防止覆蓋、錯誤處理,以及更進階的文件複製方法。
2. 準備複製文件的環境
導入 shutil
模組
shutil
模組是 Python 的標準庫之一,不需要額外安裝,可以直接使用以下程式碼來導入:
import shutil
使用該模組可以執行文件的複製、移動、刪除等操作。此外,搭配 os
模組使用,可以檢查文件或目錄是否存在,進一步加強錯誤處理。
shutil
模組的優勢
shutil
模組的特點是操作直覺且程式碼結構簡單。特別是在需要對整個文件夾進行批量操作時,shutil
是非常實用的工具。

3. shutil 模組的基本用法
shutil.copy()
的使用方法
shutil.copy()
是最基本的文件複製函式,可將原始文件複製到指定位置。
import shutil
# 複製文件
shutil.copy('original.txt', 'copy.txt')
如果目標位置已存在同名文件,則會直接覆蓋。
shutil.copy2()
的使用方法
shutil.copy2()
除了複製文件內容外,還會保留原始文件的元數據(如建立時間、權限等)。
import shutil
# 複製文件並保留元數據
shutil.copy2('original.txt', 'copy_with_metadata.txt')
如果需要完整保留文件資訊,建議使用 shutil.copy2()
。
4. 複製整個目錄的方法
shutil.copytree()
的使用方法
shutil.copytree()
可用來遞迴地複製整個目錄,包括內部的所有文件和子目錄。
import shutil
# 複製整個目錄
shutil.copytree('source_directory', 'destination_directory')
但需要注意,如果目標位置已存在同名目錄,則會出現錯誤,因此需要事先檢查。
指定忽略的文件和目錄
若要在複製過程中排除特定的文件或目錄,可以使用 ignore
參數與 shutil.ignore_patterns()
。
import shutil
# 忽略 .log 文件
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))
這段程式碼會忽略所有 .log
文件,僅複製其他文件和目錄。

5. 防止覆蓋的方法
使用 os.path.exists()
使用 shutil.copy()
或 shutil.copy2()
時,如果目標位置已有同名文件,則會直接覆蓋。要防止覆蓋,可以在執行複製前先確認文件是否存在。
import shutil
import os
# 檢查文件是否存在,避免覆蓋
if not os.path.exists('copy.txt'):
shutil.copy('original.txt', 'copy.txt')
else:
print('文件已存在,跳過複製。')
使用 pathlib.Path.exists()
使用 pathlib
模組可以更直覺地檢查文件是否存在。
from pathlib import Path
# 建立 Path 物件並檢查文件是否存在
dst = Path('copy.txt')
if not dst.exists():
shutil.copy('original.txt', dst)
else:
print('文件已存在,跳過複製。')
6. 移動文件的方法
使用 shutil.move()
shutil.move()
可用來移動文件或目錄到新的位置。
import shutil
# 移動文件
shutil.move('original.txt', 'new_folder/original.txt')
如果目標目錄不存在,會出現 FileNotFoundError
,因此建議先檢查並建立目錄。
import shutil
import os
# 檢查目標目錄是否存在,若無則建立
if not os.path.exists('new_folder'):
os.makedirs('new_folder')
# 移動文件
shutil.move('original.txt', 'new_folder/original.txt')
7. 文件複製的實際範例
複製單一文件
import shutil
# 複製文件
shutil.copy('data.txt', 'backup/data_backup.txt')
複製整個目錄
import shutil
# 複製目錄
shutil.copytree('project_files', 'project_backup')
防止覆蓋的範例
import shutil
import os
# 避免覆蓋的文件複製
if not os.path.exists('backup/report.txt'):
shutil.copy('report.txt', 'backup/report.txt')
else:
print('文件已存在,取消複製。')
8. 進階技巧:僅複製特定類型的文件
可以使用 glob
模組來篩選特定格式的文件,例如 .txt
或 .csv
。
import shutil
import glob
# 複製所有 .txt 文件
for file in glob.glob('data/*.txt'):
shutil.copy(file, 'backup/')
這樣可以將 data
目錄中的所有 .txt
文件複製到 backup
目錄。
9. 錯誤處理與例外處理
在執行文件操作時,可能會遇到文件不存在、權限錯誤等問題,因此加入錯誤處理機制非常重要。
基本的例外處理
import shutil
try:
shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
print(f'文件未找到: {e}')
except PermissionError as e:
print(f'權限錯誤: {e}')
except Exception as e:
print(f'發生未預期的錯誤: {e}')
這段程式碼能夠捕捉特定錯誤並顯示適當的訊息。
10. 總結
透過 Python 的 shutil
模組,可以輕鬆執行文件與目錄的複製操作。結合防止覆蓋的技巧、篩選特定文件類型、以及錯誤處理機制,可以讓文件操作更加安全與高效。希望本文能幫助您在日常開發中更靈活地使用 Python 進行文件管理。