Notes & software courses · Free to learn
Aph's Blog
On this page

อ่าน/เขียนไฟล์ & pathlib

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

อ่านและเขียนไฟล์อย่างปลอดภัยด้วย with open และจัดการ path สมัยใหม่ด้วย pathlib

โปรแกรมจริงต้องอ่าน/เขียนข้อมูลจากไฟล์ตลอด ทั้ง config, log, ข้อมูลผู้ใช้ หัวข้อนี้สอนวิธีจัดการไฟล์ให้ถูกต้องและปลอดภัย พร้อม pathlib ที่เป็นวิธีจัดการ path สมัยใหม่

อ่านไฟล์ด้วย with open

ใช้ with (จากบท Context Manager) เพื่อให้ไฟล์ถูกปิดอัตโนมัติเสมอ ระบุ encoding="utf-8" ทุกครั้ง

python
# อ่านทั้งไฟล์เป็นข้อความเดียว
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"สร้างใหม่ (พังถ้ามีอยู่แล้ว)
python
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="utf-8" เสมอ

ถ้าไม่ระบุ encoding Python จะใช้ค่าเริ่มต้นของระบบ ซึ่งบางเครื่อง (โดยเฉพาะ Windows) ไม่ใช่ utf-8 ทำให้ข้อความไทยเพี้ยนหรือพัง — ใส่ encoding="utf-8" ทุกครั้งที่เปิดไฟล์ข้อความ

pathlib — จัดการ path สมัยใหม่

แทนการต่อ string เป็น path เอง (เสี่ยงผิดบน OS ต่างกัน) ใช้ pathlib.Path ที่จัดการให้ถูกทุกระบบ

python
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 ทั้งหมดในโฟลเดอร์