Python CLI จัดการไฟล์ให้ฉลาดขึ้น ทนทาน ไม่กลัวปัญหา

สวัสดีครับเพื่อนๆ โปรแกรมเมอร์ทุกคน วันนี้ผมมีเรื่องที่อยากจะแชร์นะครับ เกี่ยวกับการเขียน Python CLI ให้จัดการไฟล์ได้แบบเทพๆ เลย ปกติเราเขียน CLI จัดการไฟล์ใช่ไหมครับ บางทีก็เจอไฟล์เปิดค้างบ้าง หรือมีปัญหาตอนเขียนแล้วโปรแกรม Crash บ้าง เดี๋ยววันนี้ผมจะมาบอกเทคนิคที่ช่วยให้โค้ดเราทนทานขึ้น แล้วก็เร็วขึ้นด้วยนะครับ

ใช้ Context Manager เพื่อจัดการไฟล์ให้ชัวร์

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

# ตัวอย่างที่ 1: ใช้ Context Manager (แนะนำ)
import os

file_path = 'my_data.txt'
try:
    with open(file_path, 'w') as f:
        f.write('สวัสดีครับ ผม cii3.net')
    print(f"เขียนข้อมูลลงไฟล์ '{file_path}' เรียบร้อยแล้วครับ")

    with open(file_path, 'r') as f:
        content = f.read()
        print(f"อ่านข้อมูลจากไฟล์: {content}")

except IOError as e:
    print(f"มีปัญหาการเข้าถึงไฟล์นะครับ: {e}")

finally:
    if os.path.exists(file_path):
        os.remove(file_path)
        print(f"ลบไฟล์ '{file_path}' ออกแล้วนะครับ")

จากตัวอย่างนี้จะเห็นว่า เราไม่ต้องมาคอย f.close() เองเลยนะครับ Python มันจะจัดการให้เองโดยอัตโนมัติ ไม่ว่าโค้ดด้านใน with จะ Error หรือทำงานสำเร็จก็ตาม ทำให้โค้ดเรามีความ Resilience มากขึ้นเลยครับ ไม่ต้องกังวลเรื่องไฟล์ค้าง

เพิ่มความเร็วให้งานประมวลผลไฟล์ด้วย JIT Compiler

บางครั้งนะครับ งานที่เราทำกับไฟล์เยอะๆ เช่น การแปลงข้อมูล หรือคำนวณอะไรบางอย่าง มันอาจจะช้าได้ JIT Compiler อย่าง Numba นี่แหละครับ ช่วยเร่งความเร็วให้ Python ได้แบบก้าวกระโดดเลยนะ มาลองดูตัวอย่างง่ายๆ กันครับ

# ตัวอย่างที่ 2: การประมวลผลข้อมูลในไฟล์ด้วย Numba
from numba import jit
import time
import numpy as np
import os

# สร้างไฟล์ข้อมูลใหญ่ๆ สักหน่อยนะครับ
data_file_path = 'large_data.txt'
with open(data_file_path, 'w') as f:
    for i in range(1000000):
        f.write(f"{np.random.rand()}\
")
print(f"สร้างไฟล์ '{data_file_path}' สำหรับทดสอบแล้วนะครับ")

@jit(nopython=True)
def process_data(data):
    total = 0.0
    for x in data:
        total += np.sqrt(x) # สมมติว่าเป็นการคำนวณที่ซับซ้อน
    return total

def read_and_process_file(file_path):
    numbers = []
    with open(file_path, 'r') as f:
        for line in f:
            try:
                numbers.append(float(line.strip()))
            except ValueError:
                continue # ข้ามถ้าแปลงไม่ได้
    return process_data(np.array(numbers))

start_time = time.time()
result = read_and_process_file(data_file_path)
end_time = time.time()

print(f"ผลลัพธ์การประมวลผล: {result}")
print(f"ใช้เวลาไป: {end_time - start_time:.4f} วินาทีนะครับ")

# ลบไฟล์ทดสอบ
if os.path.exists(data_file_path):
    os.remove(data_file_path)
    print(f"ลบไฟล์ '{data_file_path}' ทดสอบออกแล้วนะครับ")

จะเห็นว่าแค่เพิ่ม @jit(nopython=True) เข้าไปใน Function ที่คำนวณหนักๆ ก็ช่วยให้โค้ดของเราเร็วขึ้นได้เยอะมากเลยครับ อันนี้แหละครับ เป็นการ optimization ที่เห็นผลชัดเจนเลยนะ

การจัดการ Error เพื่อเพิ่ม Resilience

นอกจากการใช้ Context Manager แล้วนะครับ การจัดการ Error ที่ดีก็สำคัญมากนะ ช่วยให้ Python CLI ของเราทนทานต่อสถานการณ์ที่ไม่คาดฝันได้ดีขึ้นครับ ลองดูตัวอย่างนี้นะครับ ถ้าเราพยายามอ่านไฟล์ที่ไม่มีอยู่จริง

# ตัวอย่างที่ 3: การจัดการ Error สำหรับไฟล์ที่ไม่พบ
import os

non_existent_file = 'no_such_file.txt'

try:
    with open(non_existent_file, 'r') as f:
        content = f.read()
        print(f"อ่านข้อมูลจากไฟล์: {content}")
except FileNotFoundError:
    print(f"ไม่พบไฟล์ '{non_existent_file}' นะครับ\
กรุณาตรวจสอบชื่อไฟล์อีกครั้งนะ")
except IOError as e:
    print(f"มีปัญหา I/O อื่นๆ เกิดขึ้นครับ: {e}")
finally:
    print("จบการลองอ่านไฟล์แล้วครับ")

แบบนี้นะครับ โค้ดของเราก็จะบอกผู้ใช้งานได้เลยว่ามีปัญหาอะไร แทนที่จะ Crash ไปเฉยๆ ทำให้ Python CLI ของเราใช้งานได้ดีขึ้นเยอะเลยครับ

หวังว่าเทคนิคที่ผมแชร์ไปวันนี้ จะเป็นประโยชน์กับเพื่อนๆ โปรแกรมเมอร์ทุกคนนะครับ เอาไปปรับใช้กับงาน file-handling ในโปรเจกต์ของเพื่อนๆได้เลยนะ แล้วก็ อย่าลืมเรื่อง resilience กับ optimization นะครับ สำคัญมากเลย!

Read more

ฉลอง 20 ปี Google Translate เปิดตัวฟีเจอร์ AI ฝึกออกเสียงเรียลไทม์ตามคำเรียกร้อง!

ฉลอง 20 ปี Google Translate เปิดตัวฟีเจอร์ AI ฝึกออกเสียงเรียลไทม์ตามคำเรียกร้อง!

Google Translate ฉลอง 20 ปี! เปิดตัวฟีเจอร์ AI ช่วยฝึกออกเสียงแบบเรียลไทม์ ตอบโจทย์คนอยากเก่งภาษา พร้อมวิเคราะห์และให้คำแนะนำทันที

By ทีมงาน devdog
PPV คืออะไร? เจาะลึกปรากฏการณ์ Pay-Per-View กับอีเวนต์สุดพิเศษแห่งยุค

PPV คืออะไร? เจาะลึกปรากฏการณ์ Pay-Per-View กับอีเวนต์สุดพิเศษแห่งยุค

ทำความเข้าใจ Pay-Per-View (PPV) กับเทรนด์การรับชมอีเวนต์สุดพิเศษ ทั้งศึก ONE Championship, คอนเสิร์ต Project Sekai และความบันเทิงหลากหลายผ่าน ABEMA PPV.

By ทีมงาน devdog
Xiaomi 17T เผยโฉมภาพจริงจาก Anatel ลุ้นเปิดตัว พ.ค. นี้ พร้อมดีไซน์ใหม่และชาร์จไว 67W!

Xiaomi 17T เผยโฉมภาพจริงจาก Anatel ลุ้นเปิดตัว พ.ค. นี้ พร้อมดีไซน์ใหม่และชาร์จไว 67W!

พบภาพจริง Xiaomi 17T จาก Anatel เผยดีไซน์ใหม่ กล้อง Leica ชิป Dimensity 8500 แบต 6500mAh และชาร์จไว 67W ลุ้นเปิดตัวเดือนพฤษภาคมนี้!

By ทีมงาน devdog