อ่าน/เขียนไฟล์ & pathlib
อ่านและเขียนไฟล์อย่างปลอดภัยด้วย with open และจัดการ path สมัยใหม่ด้วย pathlib
โปรแกรมจริงต้องอ่าน/เขียนข้อมูลจากไฟล์ตลอด ทั้ง config, log, ข้อมูลผู้ใช้ หัวข้อนี้สอนวิธีจัดการไฟล์ให้ถูกต้องและปลอดภัย พร้อม pathlib ที่เป็นวิธีจัดการ path สมัยใหม่
อ่านไฟล์ด้วย with open
ใช้ with (จากบท Context Manager) เพื่อให้ไฟล์ถูกปิดอัตโนมัติเสมอ ระบุ encoding="utf-8" ทุกครั้ง
# อ่านทั้งไฟล์เป็นข้อความเดียว
with open("data.txt", encoding="utf-8") as f:
content = f.read()
# อ่านทีละบรรทัด (ประหยัด memory กับไฟล์ใหญ่)
with open("data.txt", encoding="utf-8") as f:
for line in f:
print(line.strip()) # strip() ตัด \n ท้ายบรรทัดเขียนไฟล์ (mode)
| mode | ความหมาย |
|---|---|
| "r" | อ่าน (ค่าเริ่มต้น) |
| "w" | เขียนทับของเดิมทั้งหมด |
| "a" | เขียนต่อท้าย (append) |
| "x" | สร้างใหม่ (พังถ้ามีอยู่แล้ว) |
with open("output.txt", "w", encoding="utf-8") as f:
f.write("บรรทัดแรก\n")
f.write("บรรทัดสอง\n")
# เขียนต่อท้าย
with open("log.txt", "a", encoding="utf-8") as f:
f.write("event ใหม่\n")ถ้าไม่ระบุ encoding Python จะใช้ค่าเริ่มต้นของระบบ ซึ่งบางเครื่อง (โดยเฉพาะ Windows) ไม่ใช่ utf-8 ทำให้ข้อความไทยเพี้ยนหรือพัง — ใส่ encoding="utf-8" ทุกครั้งที่เปิดไฟล์ข้อความ
pathlib — จัดการ path สมัยใหม่
แทนการต่อ string เป็น path เอง (เสี่ยงผิดบน OS ต่างกัน) ใช้ pathlib.Path ที่จัดการให้ถูกทุกระบบ
from pathlib import Path
folder = Path("data")
file = folder / "users.txt" # ต่อ path ด้วย / (ถูกทุก OS)
print(file.exists()) # มีไฟล์ไหม
print(file.suffix) # .txt
print(file.stem) # users
# อ่าน/เขียนสั้น ๆ ได้เลย
text = file.read_text(encoding="utf-8")
file.write_text("ข้อมูล", encoding="utf-8")
# วนทุกไฟล์ .txt ในโฟลเดอร์
for p in folder.glob("*.txt"):
print(p.name)สรุปหัวข้อนี้
- ใช้ with open(...) เพื่อปิดไฟล์อัตโนมัติเสมอ
- mode: r (อ่าน), w (ทับ), a (ต่อท้าย); วนไฟล์ทีละบรรทัดประหยัด memory
- ระบุ encoding="utf-8" ทุกครั้ง โดยเฉพาะข้อความไทย
- pathlib.Path ต่อ path ด้วย / และมี read_text/write_text/glob
1) อ่านไฟล์ข้อความแล้วนับจำนวนบรรทัดและคำ 2) เขียนผลลงไฟล์ใหม่ด้วย mode w 3) ใช้ append เพิ่ม log ต่อท้ายไฟล์เดิม 4) ใช้ pathlib วนแสดงชื่อไฟล์ .txt ทั้งหมดในโฟลเดอร์