- 1 1. บทนำ
- 2 2. การเตรียมการคัดลอกไฟล์ด้วย Python
- 3 3. วิธีใช้งานพื้นฐานของโมดูล shutil
- 4 4. วิธีคัดลอกโฟลเดอร์ทั้งหมด
- 5 5. เทคนิคการป้องกันการเขียนทับ
- 6 6. วิธีการย้ายไฟล์ด้วย Python
- 7 7. ตัวอย่างโค้ดการคัดลอกไฟล์ใน Python
- 8 8. ขั้นสูง: คัดลอกไฟล์ตามรูปแบบที่กำหนด
- 9 9. การจัดการข้อผิดพลาด (Error Handling)
- 10 10. สรุป
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 ไปใช้ในงานประจำวันได้อย่างมั่นใจ