🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

จัดการไฟล์ใน Python ได้อย่างอิสระ! คู่มือฉบับสมบูรณ์ตั้งแต่การอ่าน-เขียนพื้นฐานจนถึงการประยุกต์ใช้

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

ในการเขียนโปรแกรม คุณจะต้องเจอกับสถานการณ์ที่ "ต้องการบันทึกผลลัพธ์ของโปรแกรมเป็นไฟล์" หรือ "ต้องการอ่านข้อมูลจากไฟล์ข้อความภายนอก" อย่างแน่นอน ด้วย Python การจัดการไฟล์เหล่านี้สามารถทำได้อย่างง่ายดายอย่างน่าทึ่ง ในบทความนี้ เราจะอธิบายเกี่ยวกับการอ่านและเขียนไฟล์ (I/O) ซึ่งเป็นเรื่องที่ Web Creator ทั้งมือใหม่และมือเก๋ามักจะสับสน ตั้งแต่พื้นฐานไปจนถึงตัวอย่างการประยุกต์ใช้ พร้อมโค้ดที่สามารถคัดลอกไปวางและทำงานได้ทันที!

เมื่ออ่านบทความนี้จบ คุณจะสามารถจัดการไฟล์ใน Python ได้อย่างมั่นใจ ไปสัมผัสประสบการณ์ 'โค้ดที่ทำงานได้จริง' กันเลย! 🚀


ก้าวแรกของการจัดการไฟล์: ฟังก์ชัน `open()` และคำสั่ง `with`

ในการจัดการไฟล์ด้วย Python เราจะเริ่มต้นด้วยการใช้ฟังก์ชัน `open()` ซึ่งเป็นฟังก์ชันในตัว (built-in) เพื่อเปิดไฟล์ที่ต้องการ และสิ่งสำคัญที่ต้องจำให้ขึ้นใจในการจัดการไฟล์คือคำสั่ง `with` เมื่อเราใช้คำสั่ง `with` เพื่อเปิดไฟล์ มันจะปิดไฟล์ให้เราโดยอัตโนมัติหลังจากทำงานเสร็จสิ้น ซึ่งช่วยป้องกันการลืมปิดไฟล์ได้ นี่เปรียบเสมือน "ธรรมเนียมปฏิบัติ" ของ Python ดังนั้นควรเรียนรู้และใช้คู่กันเสมอ

ฟังก์ชัน `open()` ต้องการข้อมูลหลักๆ 2 อย่าง:

โหมดพื้นฐานที่สุดมี 3 โหมดดังนี้:

นอกจากนี้ เมื่อทำงานกับข้อความที่มีตัวอักษรหลายไบต์เช่นภาษาไทย การระบุ encoding='utf-8' เป็นเรื่องปกติเพื่อป้องกันปัญหาตัวอักษรผิดเพี้ยน (ตัวหนังสือต่างดาว) งั้นเรามาดูตัวอย่างการใช้งานจริงกันเลย!


การอ่านไฟล์: นำข้อมูลเข้าสู่ Python

ก่อนอื่น มาดูวิธีการอ่านเนื้อหาจากไฟล์ข้อความกัน โดยจะสมมติว่ามีไฟล์ชื่อ sample.txt ที่มีเนื้อหาดังต่อไปนี้ อยู่ในไดเรกทอรีเดียวกับสคริปต์ Python ของเรา

สวัสดี Python!
นี่คือไฟล์ข้อความตัวอย่าง
มาเรียนรู้การจัดการไฟล์กันเถอะ

read(): การอ่านไฟล์ทั้งหมดในครั้งเดียว

เมื่อใช้เมธอด read() จะเป็นการดึงเนื้อหาทั้งหมดในไฟล์และส่งกลับมาเป็นสตริงขนาดใหญ่เพียงสตริงเดียว เหมาะสำหรับไฟล์ขนาดเล็ก

<!-- โค้ด Python -->
try:
    with open('sample.txt', 'r', encoding='utf-8') as f:
        content = f.read()
        print(content)
except FileNotFoundError:
    print('ข้อผิดพลาด: ไม่พบไฟล์ sample.txt')

<!-- ผลลัพธ์ที่คาดหวัง -->
# สวัสดี Python!
# นี่คือไฟล์ข้อความตัวอย่าง
# มาเรียนรู้การจัดการไฟล์กันเถอะ

readlines(): การอ่านทีละบรรทัดเป็นลิสต์

เมธอด readlines() จะคืนค่าเป็นลิสต์ (list) ที่แต่ละรายการคือหนึ่งบรรทัดของไฟล์ โปรดทราบว่าท้ายของแต่ละบรรทัดจะมีอักขระขึ้นบรรทัดใหม่ (\n) รวมอยู่ด้วย

<!-- โค้ด Python -->
try:
    with open('sample.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        print(lines)
except FileNotFoundError:
    print('ข้อผิดพลาด: ไม่พบไฟล์ sample.txt')

<!-- ผลลัพธ์ที่คาดหวัง -->
# ['สวัสดี Python!\n', 'นี่คือไฟล์ข้อความตัวอย่าง\n', 'มาเรียนรู้การจัดการไฟล์กันเถอะ\n']

ลูป `for`: การอ่านไฟล์ขนาดใหญ่อย่างมีประสิทธิภาพ

หากไฟล์มีขนาดใหญ่มาก การอ่านข้อมูลทั้งหมดเข้าสู่หน่วยความจำในครั้งเดียวด้วย read() หรือ readlines() จะไม่มีประสิทธิภาพ ในกรณีเช่นนี้ แนวทางปฏิบัติที่ดีที่สุดคือการใช้ลูป for เพื่อประมวลผลไฟล์ทีละบรรทัด ซึ่งเป็นวิธีที่ประหยัดหน่วยความจำมากที่สุด

<!-- โค้ด Python -->
try:
    with open('sample.txt', 'r', encoding='utf-8') as f:
        for line in f:
            # print() จะขึ้นบรรทัดใหม่โดยอัตโนมัติ จึงต้องลบอักขระขึ้นบรรทัดใหม่เดิมออก
            print(line.strip())
except FileNotFoundError:
    print('ข้อผิดพลาด: ไม่พบไฟล์ sample.txt')

<!-- ผลลัพธ์ที่คาดหวัง -->
# สวัสดี Python!
# นี่คือไฟล์ข้อความตัวอย่าง
# มาเรียนรู้การจัดการไฟล์กันเถอะ

การเขียนไฟล์: บันทึกข้อมูลจาก Python

ต่อไป เรามาดูวิธีการเขียนข้อมูลที่สร้างขึ้นใน Python ลงในไฟล์กัน โดยให้สังเกตความแตกต่างระหว่างโหมด 'w' (เขียนทับ) และ 'a' (เขียนต่อท้าย)

write(): การเขียนไฟล์ใหม่ (โหมดเขียนทับ)

เมื่อเปิดไฟล์ในโหมด 'w' หากไม่มีไฟล์อยู่จะถูกสร้างขึ้นใหม่ แต่ถ้ามีไฟล์อยู่แล้ว เนื้อหาภายในจะถูกล้างและรีเซ็ตเป็นค่าว่าง เราจะใช้เมธอด write() เพื่อเขียนสตริง

ข้อควรระวัง: write() จะไม่ขึ้นบรรทัดใหม่ให้โดยอัตโนมัติ หากต้องการขึ้นบรรทัดใหม่ คุณต้องเพิ่มอักขระ \n เข้าไปท้ายสตริงด้วยตนเอง

<!-- โค้ด Python -->
# ลิสต์ของเนื้อหาที่ต้องการเขียน
lines_to_write = [
    'นี่คือไฟล์ใหม่\n',
    'กำลังเขียนด้วยเมธอด write()\n',
    'การขึ้นบรรทัดใหม่ต้องใช้ \\n\n'
]

with open('output.txt', 'w', encoding='utf-8') as f:
    for line in lines_to_write:
        f.write(line)

print('เขียนไฟล์ output.txtเสร็จสมบูรณ์')

# หลังจากรันโค้ดนี้ จะมีไฟล์ 'output.txt' ถูกสร้างขึ้น
# และมีเนื้อหาดังต่อไปนี้:
# 
# นี่คือไฟล์ใหม่
# กำลังเขียนด้วยเมธอด write()
# การขึ้นบรรทัดใหม่ต้องใช้ \n

write(): การเขียนต่อท้ายไฟล์ที่มีอยู่ (โหมดต่อท้าย)

การใช้โหมด 'a' จะช่วยให้คุณสามารถเพิ่มข้อมูลใหม่ต่อท้ายไฟล์ที่มีอยู่ได้โดยไม่ลบเนื้อหาเดิม เหมาะสำหรับไฟล์ประเภท log ที่ต้องการสะสมข้อมูลไปเรื่อยๆ

<!-- โค้ด Python -->
# เขียนต่อท้ายไฟล์ 'output.txt' ที่สร้างไว้ก่อนหน้านี้
with open('output.txt', 'a', encoding='utf-8') as f:
    f.write('นี่คือบรรทัดที่เขียนต่อท้าย\n')

print('เขียนต่อท้ายไฟล์ output.txt เสร็จสมบูรณ์')

# หลังจากรันโค้ดนี้ เนื้อหาใน 'output.txt' จะเป็นดังนี้:
# 
# นี่คือไฟล์ใหม่
# กำลังเขียนด้วยเมธอด write()
# การขึ้นบรรทัดใหม่ต้องใช้ \n
# นี่คือบรรทัดที่เขียนต่อท้าย

ตัวอย่างประยุกต์: การสร้างไฟล์ HTML ด้วย Python

ลองนำความรู้ที่ผ่านมาประยุกต์ใช้กับตัวอย่างที่ใกล้ตัวสำหรับ Web Creator กันดูนะครับ นี่คือตัวอย่างการสร้างไฟล์ HTML แบบไดนามิกด้วยสคริปต์ Python โดยจะสร้างการ์ดโปรไฟล์อย่างง่ายจากข้อมูลในลิสต์

เมื่อรันโค้ด Python ด้านล่าง จะมีการสร้างไฟล์ชื่อ profile.html ขึ้นมา ซึ่งนี่คือ "ตัวอย่างโค้ด HTML ที่ทำงานได้สมบูรณ์" ครับ

ขั้นตอนที่ 1: โค้ด Python สำหรับสร้าง HTML

บันทึกโค้ดนี้ในชื่อ generate_html.py หรือชื่ออื่นแล้วลองรันดู

<!-- โค้ด Python: generate_html.py -->
# ข้อมูลโปรไฟล์
profile_data = {
    'name': 'สมชาย ใจดี',
    'job': 'นักพัฒนาเว็บ',
    'skills': ['HTML', 'CSS', 'JavaScript', 'Python'],
    'message': 'ด้วย Python คุณสามารถสร้าง HTML แบบไดนามิกเช่นนี้ได้!'
}

# สร้าง HTML สำหรับรายการทักษะ
skill_list_html = ''
for skill in profile_data['skills']:
    skill_list_html += f'          <li>{skill}</li>\n'

# เทมเพลต HTML ทั้งหมด
html_template = f"""
<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>โปรไฟล์ที่สร้างขึ้น</title>
    <style>
        body {{
            font-family: sans-serif;
            background-color: #121212;
            color: #e0e0e0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }}
        .card {{
            background-color: #1e1e1e;
            border-radius: 10px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
            padding: 2rem;
            width: 350px;
            border: 1px solid #5f6368;
        }}
        h1 {{
            color: #669df6;
            text-align: center;
        }}
        h2 {{
            color: #8ab4f8;
            border-bottom: 1px solid #5f6368;
            padding-bottom: 0.5rem;
        }}
        ul {{
            list-style: none;
            padding: 0;
        }}
        li {{
            background-color: #333;
            border-radius: 5px;
            padding: 0.5rem 1rem;
            margin-bottom: 0.5rem;
        }}
        p {{
            line-height: 1.6;
        }}
    </style>
</head>
<body>
    <div class="card">
        <h1>{profile_data['name']}</h1>
        <p>{profile_data['job']}</p>

        <h2>ทักษะ</h2>
        <ul>
{skill_list_html}
        </ul>

        <h2>ข้อความ</h2>
        <p>{profile_data['message']}</p>
    </div>
</body>
</html>
"""

# เขียนลงไฟล์
file_path = 'profile.html'
with open(file_path, 'w', encoding='utf-8') as f:
    f.write(html_template)

print(f"สร้างไฟล์ '{file_path}' แล้ว ลองเปิดในเบราว์เซอร์เพื่อตรวจสอบ")

ขั้นตอนที่ 2: ไฟล์ HTML ที่ถูกสร้างขึ้น (`profile.html`)

เมื่อรันโค้ด Python ด้านบน จะมีการสร้างไฟล์ profile.html ที่มีเนื้อหาดังต่อไปนี้ขึ้นมา ลองเปิดไฟล์นี้ในเว็บเบราว์เซอร์ดู คุณจะเห็นการ์ดโปรไฟล์สวยๆ ที่รองรับ Dark Mode

<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>โปรไฟล์ที่สร้างขึ้น</title>
    <style>
        body {
            font-family: sans-serif;
            background-color: #121212;
            color: #e0e0e0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .card {
            background-color: #1e1e1e;
            border-radius: 10px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
            padding: 2rem;
            width: 350px;
            border: 1px solid #5f6368;
        }
        h1 {
            color: #669df6;
            text-align: center;
        }
        h2 {
            color: #8ab4f8;
            border-bottom: 1px solid #5f6368;
            padding-bottom: 0.5rem;
        }
        ul {
            list-style: none;
            padding: 0;
        }
        li {
            background-color: #333;
            border-radius: 5px;
            padding: 0.5rem 1rem;
            margin-bottom: 0.5rem;
        }
        p {
            line-height: 1.6;
        }
    </style>
</head>
<body>
    <div class="card">
        <h1>สมชาย ใจดี</h1>
        <p>นักพัฒนาเว็บ</p>

        <h2>ทักษะ</h2>
        <ul>
          <li>HTML</li>
          <li>CSS</li>
          <li>JavaScript</li>
          <li>Python</li>

        </ul>

        <h2>ข้อความ</h2>
        <p>ด้วย Python คุณสามารถสร้าง HTML แบบไดนามิกเช่นนี้ได้!</p>
    </div>
</body>
</html>

ข้อควรระวังและแนวทางปฏิบัติที่ดีที่สุด

การจัดการไฟล์นั้นทรงพลัง แต่ก็มีข้อควรระวังบางประการ:


สรุปและขั้นตอนต่อไป

ในครั้งนี้ เราได้เรียนรู้วิธีการอ่านและเขียนไฟล์ซึ่งเป็นพื้นฐานของการจัดการไฟล์ใน Python หากคุณเชี่ยวชาญไวยากรณ์ with open() แล้ว การบันทึกข้อมูลอย่างถาวรและการเชื่อมต่อกับข้อมูลภายนอกจะง่ายขึ้นมาก

  • พื้นฐานการเปิดไฟล์คือ with open('ชื่อไฟล์', 'โหมด', encoding='utf-8') as f:
  • สำหรับการอ่าน ให้เลือกใช้ read(), readlines() หรือลูป for ให้เหมาะกับความต้องการ
  • สำหรับการเขียน ให้ใช้ write() และแยกแยะระหว่าง 'w' (เขียนทับ) และ 'a' (เขียนต่อท้าย)
  • เมื่อทำงานกับภาษาไทย encoding='utf-8' เป็นสิ่งจำเป็น!

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

มาจัดการ Exception Handling ใน Python (try-except) ให้เชี่ยวชาญกันเถอะ