การใช้ Python คัดลอกไฟล์และโฟลเดอร์ด้วยโมดูล shutil | คู่มือพร้อมโค้ดตัวอย่าง

1. บทนำ

Python มีเครื่องมือที่ทรงพลังสำหรับการจัดการไฟล์ได้อย่างง่ายดาย โดยหนึ่งในงานที่ทำบ่อยที่สุดคือการคัดลอกไฟล์ บทความนี้จะแนะนำวิธีการคัดลอกไฟล์และโฟลเดอร์อย่างมีประสิทธิภาพด้วยโมดูลมาตรฐานของ Python ที่ชื่อว่า shutil พร้อมทั้งแสดงตัวอย่างโค้ด เทคนิคการป้องกันการเขียนทับ การจัดการข้อผิดพลาด รวมถึงวิธีการคัดลอกไฟล์ขั้นสูง

2. การเตรียมการคัดลอกไฟล์ด้วย Python

การนำเข้าโมดูล 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')

เหมาะสำหรับกรณีที่ต้องการสำเนาที่ครบถ้วนของไฟล์

4. วิธีคัดลอกโฟลเดอร์ทั้งหมด

การใช้ shutil.copytree()

shutil.copytree() ใช้คัดลอกทั้งโฟลเดอร์แบบ recursive โดยจะคัดลอกทุกไฟล์และโฟลเดอร์ย่อยไปยังตำแหน่งใหม่

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 object
dst = Path('copy.txt')

if not dst.exists():
    shutil.copy('original.txt', dst)
else:
    print('ไฟล์มีอยู่แล้ว ข้ามการคัดลอก')

6. วิธีการย้ายไฟล์ด้วย Python

วิธีใช้ 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. ตัวอย่างโค้ดการคัดลอกไฟล์ใน Python

ตัวอย่างการคัดลอกไฟล์

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/')

โค้ดนี้จะคัดลอกไฟล์ .txt ทั้งหมดจากโฟลเดอร์ data ไปยัง backup

9. การจัดการข้อผิดพลาด (Error Handling)

การจัดการข้อผิดพลาดเป็นสิ่งสำคัญ เช่น ไฟล์ไม่พบ หรือสิทธิ์ไม่เพียงพอ

ตัวอย่างการใช้ try-except

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. สรุป

การใช้โมดูล shutil ของ Python ทำให้การคัดลอกไฟล์และโฟลเดอร์เป็นเรื่องง่าย คุณสามารถเพิ่มเทคนิคป้องกันการเขียนทับ คัดลอกไฟล์ตามรูปแบบที่กำหนด และจัดการข้อผิดพลาด เพื่อทำให้การจัดการไฟล์มีความปลอดภัยและมีประสิทธิภาพมากขึ้น หวังว่าบทความนี้จะช่วยให้คุณนำ Python ไปใช้ในงานประจำวันได้อย่างมั่นใจ