Hướng dẫn toàn diện về sao chép tệp trong Python | Cách sử dụng mô-đun shutil và xử lý lỗi

1. Giới thiệu

Python cung cấp các công cụ mạnh mẽ để thao tác tệp một cách dễ dàng. Trong số đó, sao chép tệp là một trong những tác vụ phổ biến hàng ngày. Bài viết này sẽ giới thiệu cách sao chép tệp và thư mục hiệu quả bằng mô-đun shutil trong thư viện tiêu chuẩn của Python. Chúng tôi sẽ đề cập đến các kỹ thuật tránh ghi đè, xử lý lỗi, cũng như các phương pháp sao chép nâng cao, đi kèm với các ví dụ mã cụ thể.

2. Chuẩn bị để sao chép tệp trong Python

Nhập mô-đun shutil

Mô-đun shutil là một phần của thư viện tiêu chuẩn Python, vì vậy không cần cài đặt thêm. Bạn có thể nhập nó bằng đoạn mã sau:

import shutil

Nó cho phép thực hiện các thao tác như sao chép, di chuyển và xóa tệp. Ngoài ra, khi kết hợp với mô-đun os, bạn có thể kiểm tra sự tồn tại của tệp hoặc thư mục và tăng cường xử lý lỗi.

Lợi ích của mô-đun shutil

Mô-đun shutil nổi bật với sự đơn giản và khả năng thao tác trực quan. Đặc biệt, khi cần thực hiện các thao tác trên toàn bộ thư mục, shutil trở thành một công cụ mạnh mẽ.

3. Cách sử dụng cơ bản của mô-đun shutil

Cách sử dụng shutil.copy()

shutil.copy() là hàm cơ bản để sao chép tệp. Hàm này sẽ sao chép tệp gốc vào vị trí mới được chỉ định.

import shutil

# Sao chép tệp
shutil.copy('original.txt', 'copy.txt')

Nếu tệp đích đã tồn tại, nội dung của nó sẽ bị ghi đè.

Cách sử dụng shutil.copy2()

shutil.copy2() là một hàm nâng cao hơn, không chỉ sao chép nội dung tệp mà còn giữ nguyên các siêu dữ liệu như ngày tạo và quyền truy cập.

import shutil

# Sao chép nội dung tệp cùng với siêu dữ liệu
shutil.copy2('original.txt', 'copy_with_metadata.txt')

Hàm này rất hữu ích khi bạn muốn tạo bản sao hoàn chỉnh của tệp gốc.

4. Cách sao chép toàn bộ thư mục

Sử dụng shutil.copytree()

shutil.copytree() cho phép sao chép toàn bộ thư mục, bao gồm tất cả các tệp và thư mục con bên trong nó.

import shutil

# Sao chép toàn bộ thư mục
shutil.copytree('source_directory', 'destination_directory')

Tuy nhiên, nếu thư mục đích đã tồn tại, hàm này sẽ báo lỗi. Do đó, bạn cần kiểm tra trước khi thực hiện sao chép.

Loại trừ tệp hoặc thư mục khi sao chép

Để loại trừ một số tệp hoặc thư mục khi sao chép, bạn có thể sử dụng tham số ignore với shutil.ignore_patterns().

import shutil

# Bỏ qua các tệp có phần mở rộng .log khi sao chép
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))

Đoạn mã này sẽ sao chép toàn bộ thư mục nhưng bỏ qua các tệp có phần mở rộng .log.

5. Kỹ thuật tránh ghi đè khi sao chép

Sử dụng os.path.exists()

Mặc định, khi sử dụng shutil.copy() hoặc shutil.copy2(), nếu tệp đích đã tồn tại, nội dung sẽ bị ghi đè. Để tránh điều này, bạn nên kiểm tra sự tồn tại của tệp trước khi sao chép.

import shutil
import os

# Kiểm tra tệp trước khi sao chép để tránh ghi đè
if not os.path.exists('copy.txt'):
    shutil.copy('original.txt', 'copy.txt')
else:
    print('Tệp đã tồn tại. Bỏ qua sao chép.')

Sử dụng pathlib.Path.exists()

Thư viện pathlib giúp kiểm tra sự tồn tại của tệp một cách trực quan hơn.

from pathlib import Path

# Kiểm tra sự tồn tại của tệp bằng Path object
dst = Path('copy.txt')

if not dst.exists():
    shutil.copy('original.txt', dst)
else:
    print('Tệp đã tồn tại. Bỏ qua sao chép.')

6. Cách di chuyển tệp trong Python

Cách sử dụng shutil.move()

shutil.move() là hàm dùng để di chuyển tệp hoặc thư mục đến vị trí mới.

import shutil

# Di chuyển tệp đến thư mục mới
shutil.move('original.txt', 'new_folder/original.txt')

Nếu thư mục đích chưa tồn tại, sẽ có lỗi FileNotFoundError. Do đó, bạn nên kiểm tra và tạo thư mục trước khi di chuyển tệp.

import shutil
import os

# Kiểm tra và tạo thư mục trước khi di chuyển tệp
if not os.path.exists('new_folder'):
    os.makedirs('new_folder')

shutil.move('original.txt', 'new_folder/original.txt')
侍エンジニア塾

7. Ví dụ thực tế về sao chép tệp trong Python

Ví dụ sao chép một tệp

import shutil

# Sao chép tệp
shutil.copy('data.txt', 'backup/data_backup.txt')

Ví dụ sao chép toàn bộ thư mục

import shutil

# Sao chép thư mục
shutil.copytree('project_files', 'project_backup')

Ví dụ tránh ghi đè khi sao chép

import shutil
import os

# Kiểm tra sự tồn tại của tệp trước khi sao chép
if not os.path.exists('backup/report.txt'):
    shutil.copy('report.txt', 'backup/report.txt')
else:
    print('Tệp đã tồn tại. Hủy bỏ sao chép.')

8. Cách sao chép chỉ các tệp có định dạng cụ thể

Bạn có thể sử dụng mô-đun glob để chỉ sao chép các tệp có định dạng cụ thể (ví dụ: .txt, .csv).

import shutil
import glob

# Sao chép tất cả các tệp .txt
for file in glob.glob('data/*.txt'):
    shutil.copy(file, 'backup/')

Đoạn mã trên sẽ sao chép tất cả các tệp .txt từ thư mục data vào thư mục backup.

9. Xử lý lỗi và ngoại lệ

Trong quá trình thao tác tệp, có thể xảy ra một số lỗi như tệp không tồn tại hoặc lỗi quyền truy cập. Do đó, việc xử lý ngoại lệ là rất quan trọng.

Thêm xử lý ngoại lệ cơ bản

import shutil

try:
    shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
    print(f'Tệp không tồn tại: {e}')
except PermissionError as e:
    print(f'Lỗi quyền truy cập: {e}')
except Exception as e:
    print(f'Lỗi không xác định: {e}')

Đoạn mã trên sẽ bắt và xử lý từng loại lỗi cụ thể.

10. Tổng kết

Mô-đun shutil của Python giúp bạn sao chép và di chuyển tệp hoặc thư mục một cách dễ dàng. Khi kết hợp với các kỹ thuật như kiểm tra sự tồn tại của tệp để tránh ghi đè, sao chép có chọn lọc theo định dạng tệp, và xử lý lỗi, bạn có thể thực hiện các thao tác tệp một cách an toàn và hiệu quả. Hãy áp dụng những phương pháp này vào công việc hàng ngày của bạn với Python!