Python 文件複製完整指南|shutil 模組的使用方法與錯誤處理

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 文件,僅複製其他文件和目錄。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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 進行文件管理。