LESSON
4
การเขียนโปรแกรม
เพื่อจัดการข้อมูลอย่างง่าย
การจัดการเรื่องแฟ้มในทุก ๆ โปรแกรม มีกระบวนการเบื้องต้น ได้แก่ เปิดแฟ้ม บันทึกแฟ้ม ซึ่งโปรแกรม
ประยุกต์ที่สนับสนุนการใช้งานจะต้องเขียนโปรแกรมให้ผู้ใช้ ใช้งานได้อย่างสะดวก ใช้ได้ง่าย ภาษาไพทอนเป็น
ภาษาระดับสูงเช่นเดียวกับภาษาอื่น ๆ ที่มีฟังก์ชันให้ใช้งานครบถ้วนทุกด้านเกี่ยวกับการจัดการแฟ้ม ซึ่งในบทนี้
จะได้ให้รายละเอียดในด้านการจัดการกับแฟ้ม ได้แก่ การเปิด-ปิด การเขียน การอ่าน การลบ การแก้ไข การ
ค้นหาแฟ้ม การบีบอัดและการขยายแฟ้ม รวมทั้งการจัดการสารบบ ได้แก่ การสร้างและการลบสารบบ เป็นต้น
การเปิ ดและปิ ดแฟ้ ม
สิ่งแรกที่ผู้ใช้คอมพิวเตอร์คุ้นเคย คือ การเปิดและปิดแฟ้ม เมื่อเปิดโปรแกรมส าเร็จรูปใด ๆ มักจะเห็น
หน้าต่างของโปรแกรมนั้น ต่อจากนั้นผู้ใช้จะเริ่มต้นใช้เมนูเพื่อเปิดแฟ้ม และเลือกแฟ้มที่ต้องการเปิด เมื่ออ่าน
หรือกระท าการใด ๆ กับแฟ้มที่เปิดขึ้นมานั้น สิ่งที่ต้องท าเป็นล าดับสุดท้าย คือ การปิดแฟ้มนั้นเสียก่อน หรือปิด
โปรแกรมประยุกต์เหล่านั้นไป
การเปิดแฟ้ม
ภาษาไพทอน มีฟังก์ชันเพื่อเปิดแฟ้ม ดังนี้
file object = open(file_name [, access_mode][, buffering])
ฟังก์ชันนี้ท าหน้าที่เพื่อเปิดแฟ้มส าหรับอ่านและเขียนแฟ้ม โดยมีรายละเอียด อาร์กิวเมนต์ ดังนี้
file_name คือไฟล์ที่เราต้องการเปิด
access_mode คือรูปแบบในการเปิดไฟล์ดูรายละเอียดในตารางด้านล่าง
โหมด รายละเอียด
r เปิดแฟ้มที่มีอยู่แล้วเพื่ออ่านเพียงอย่างเดียว
w เปิดแฟ้มเพื่อเขียนเพียงอย่างเดียว ถ้ายังไม่มีไฟล์จะสร้างไฟล์ใหม่
a เปิดแฟ้มเพื่อเขียนข้อมูลต่อท้ายข้อมูลเดิม
r+ เปิดแฟ้มเพื่ออ่านและเขียน โดยที่ข้อมูลเก่าจะถูกลบ
a+ เปิดแฟ้มเพื่ออ่านและเขียน โดยที่ข้อมูลเก่ายังมีอยู่
w+ เปิดแฟ้มเพื่ออ่านและเขียน โดยที่ข้อมูลเก่าจะถูกลบ ถ้ายังไม่มีไฟล์จะสร้างไฟล์ใหม่
b เพื่อใช้ส าหรับการอ่าน หรือเขียน หรือเพิ่มเติมข้อมูลอย่างใดอย่างหนึ่ง โดยการเปิด
แฟ้มแบบไบนารีโหมด
U เพื่อใช้ส าหรับการอ่าน หรือเขียน หรือเพิ่มเติมข้อมูลอย่างใดอย่างหนึ่ง โดยการเปิด
แฟ้มแบบ universal โหมด
buffering ก าหนดว่าเราจะใช้ buffer หรือไม่
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 75
ถ้า buffersize เป็น 0 หมายถึง ไม่มีการใช้บัฟเฟอร์
ถ้าเป็น 1 หมายถึง เป็นการใช้ line-buffer หรือ
ถ้าใส่จ านวนตัวเลขเป็นบวก หมายถึง ก าหนดขนาดหน่วยความจ าด้วยตนเอง แต่ถ้าไม่ใส่ค่า
อาร์กิวเมนต์ของบัฟเฟอร์ จะเป็นไปตามที่โปรแกรมได้ก าหนดค่าเริ่มต้นเอาไว้
ตัวอย่างที่ 4.1 การเปิดแฟ้มข้อมูล
1 # Open a file
2 fo = open("foo.txt", "wb")
3 print ("Name of the file: ", fo.name)
4 print ("Closed or not : ", fo.closed)
5 print ("Opening mode : ", fo.mode)
ผลลัพธ์ที่ได้คือ
Name of the file: foo.txt
Closed or not : False
Opening mode : wb
โดยปกติแล้วในการท างานกับไฟล์สามารถมีข้อผิดพลาดเกิดขึ้นได้ และนั่นจะท าให้โปรแกรมหยุดการ
ท างานในทันที ส่งผลให้ File object ไม่ถูกปิดอย่างถูกต้อง ในภาษา Python เราสามารถใช้งานไฟล์กับ
ค าสั่ง with เพื่อยืนยันว่า File object จะถูกปิดการใช้งานเสมอไม่ว่าจะเกิดข้อผิดพลาดหรือไม่ก็ตาม มี
รูปแบบการใช้ดังนี้
with open(filename, mode) as f:
# file operations
ตัวอย่างที่ 4.2 การเปิดแฟ้มข้อมูลด้วยค าสั่ง with open
1 # Open a file
2 with open(“myfile.txt”, “r”) as f :
3 s = f.read()
4 print(s)
การปิดแฟ้ม
หลังจากการใช้ค าสั่งการจัดการแฟ้มใด ๆ ก็ตามจะต้องมีการปิดแฟ้มในทุก ๆ ครั้ง โดยการใช้เมท็อด
close() เพื่อการยกเลิกการใช้ทรัพยากรต่าง ๆ ของเครื่องคอมพิวเตอร์ รูปแบบค าสั่งเพื่อเปิดปิดแฟ้มเป็นดังนี้
fileObject.close();
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 76
ตัวอย่างที่ 4.3 การปิดแฟ้มข้อมูล
1 # Open a file
2 fo = open("foo.txt", "wb")
3 print ("Name of the file: ", fo.name)
4 # Close opend file
5 fo.close()
ผลลัพธ์ที่ได้คือ
Name of the file: foo.txt
การอ่านและเขียนแฟ้ ม
การอ่านแฟ้ม
การอ่านจากแฟ้มทั้งหมด
การเขียนโปรแกรมเพื่อเปิดแฟ้ม แล้วให้อ่านเนื้อหาของแฟ้มออกมาทั้งหมดตามต้นฉบับจริงนั้น นิยม
ใช้เมท็อด read() แต่มีวิธีการหรือมีฟังก์ชันอื่นที่สามารถน าไปใช้แทนได้ ทั้งนี้ขึ้นอยู่กับความเร็ว หรือเทคนิค
การน าไปใช้ ซึ่งจะแตกต่างกัน การอ่านข้อมูลจากแฟ้มนั้นมีวิธีการ 3 วิธีด้วยกัน ดังนี้
1. การใช้เมท็อด read() เมท็อดนี้จะอ่านเนื้อหาของเอกสารทั้งแฟ้มตั้งแต่ต้นจนจบที่ต าแหน่ง
EOF (end of file) และจะส่งค่าที่เป็นเนื้อหาทั้งหมดออกมาเป็นสายอักขระ
2. การใช้เมท็อด readlines() เมท็อดนี้จะอ่านแฟ้มทั้งหมดแยกออกมาแต่ละบรรทัดในลักษณะ
สายอักขระ จนกระทั่งเจอต าแหน่ง EOF ข้อมูลจะเก็บอยู่ในโครงสร้างแบบลิสต์
3. การใช้เมท็อด read(bytes) ซึ่งมักจะใช้กับแฟ้มที่มีขนาดใหญ่ เพราะต้องการลดภาระงานใน
การประมวลผล การส่งค่าจะส่งจ านวนบรรทัดออกมาเป็นข้อมูลสายอักขระ แต่ถ้าในบรรทัดแรกมีต าแหน่ง
EOF อยู่ จะส่งค่า null ออกมา
รูปแบบการใช้ค าสั่ง
fileObject.read([count]);
ตัวอย่างที่ 4.4 การอ่านแฟ้มข้อมูล
1 # Read a file
2 fo = open("foo.txt", "r+")
3 str = fo.read(10);
4 print ("Read String is : ", str)
5 # Close opend file
6 fo.close()
ผลลัพธ์ที่ได้คือ
Read String is : Python is
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 77
การอ่านแฟ้มแต่ละบรรทัด
การอ่านจากแฟ้มในแต่ละบรรทัดนั้น จะมีประโยชน์ส าหรับการเปิดแฟ้มจากเว็บไซต์ที่ผู้ใช้ต้องการ
ข่าวสารสนเทศ หรือกรณีอื่น ๆ เนื่องจากภาษาไพทอนมีมอดูลด้านนี้โดยตรงจึงท าให้สามารถเรียกใช้ได้อย่าง
ง่ายดาย มอดูล linecache ประกอบด้วยเมท็อด getline(filename,lineno) การท างานของค าสั่ง
จะก าหนดให้แฟ้มที่อ่านมาได้ จัดเก็บอยู่ในหน่วยความจ าก่อน จากนั้นจะน าเอาบรรทัดในแต่ละอาร์กิวเมนต์มา
แสดงเมื่อเลิกใช้ค าสั่งของมอดูล linecache แล้วจะต้องใช้ค าสั่งเพื่อคืนหน่วยความจ าด้วยเมท็อด clearcache()
ตัวอย่างที่ 4.5 การอ่านแฟ้มข้อมูล
1 import linecache
2 file="readn.txt"
3 for line in [1,3,5]:
4 print(linecache.getline(file,line))
5 linecache.clearcache()
ผลลัพธ์ที่ได้คือ
AAAAAAAAAAAAAAA
CCCCCCCCCCCCCCC
EEEEEEEEEEEEEEEEE
การเขียนแฟ้ม
การเขียนข้อมูลลงในแฟ้ม มีประโยชน์ในด้านการเขียนปรับปรุงแฟ้มที่มีข้อมูลอยู่แล้วหรือเป็นแฟ้มว่าง
เปล่า เพราะในปัจจุบันสามารถน าไปประยุกต์กับการเขียนโปรแกรมที่เกี่ยวข้องกับฐานข้อมูลที่บริการ
สาธารณะ เช่น แผนที่ของ Google เป็นต้น การเขียนข้อมูลลงแฟ้มใช้เมท็อด write(string) นอกจากนี้ยังมี
เมท็อด writelines(sequence) เพื่อการเขียนข้อมูลในแบบลิสต์ลงแฟ้ม นอกจากนี้โปรแกรมภาษาไพทอนยังมี
ฟังก์ชัน print >> เพื่อการเขียนข้อมูลลงไปในแฟ้ม เพื่อให้ผู้ใช้เลือกใช้ได้อย่างสะดวก
รูปแบบการใช้ค าสั่ง
fileObject.write(string);
ตัวอย่างที่ 4.6 การเขียนข้อมูลลงแฟ้ม
1 # Open a file
2 fo = open("foo.txt", "wb")
3 fo.write(“Python is a great language.\nYeah its great!!\n”);
4 # Close opend file
5 fo.close()
ผลลัพธ์ที่ได้คือ
Python is a great language.
Yeah its great!!
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 78
ตัวอย่างที่ 4.7 การเขียนข้อมูลลงแฟ้มและการอ่านข้อมูลจากแฟ้ม
1 def peopleInfo():
2 txtFile = open("info.txt", "w")
3 i = 0
4 for i in range(0, 3):
5 name = input("Enter name ")
6 age = input("Enter age ")
7 hometown = input("Enter hometown ")
8 txtFile.write(name + "\n" + age + "\n" + hometown + "\n")
9 txtFile.close()
10
11 def splitLine():
12 txtFile = open("info.txt", "r")
13 for line in txtFile:
14 line = line.rstrip("\n")
15 print(line)
16
17 peopleInfo()
18 splitLine()
ผลลัพธ์ที่ได้คือ
การเปลี่ยนชื่อแฟ้ม
การเปลี่ยนชื่อแฟ้ม ซึ่งเดิมมีอยู่ในค าสั่งของระบบปฏิบัติการทั่วไป โดยปกติผู้ใช้จะใช้ explorer เพื่อ
เปลี่ยนชื่อแฟ้ม แต่โปรแกรมภาษาไพทอนได้สร้างมอดูลสนับสนุนการจัดการเกี่ยวกับแฟ้มและสารบบมาให้ใช้
อยู่แล้ว ถ้าหากต้องการน าไปใช้กับโปรแกรมที่พัฒนาขึ้นมาจะท าให้โปรแกรมมีคุณค่าและมีคุณภาพยิ่งขึ้น
มอดูลที่ใช้ ได้แก่ มอดูล os และมีเมท็อด rename(oldFile, newFile) ส าหรับเปลี่ยนชื่อ กระบวนการเปลี่ยน
ชื่อแฟ้มโดยล าดับแรกโปรแกรมจะต้องตรวจสอบหาต าแหน่งที่ตั้งพร้อมกับชื่อแฟ้มเดิมจะต้องมีอยู่จริงหรือไม่
ต่อจากนั้นจึงท าการแก้ไขชื่อแฟ้มเป็นแฟ้มใหม่ตามอาร์กิวเมนต์ที่ระบุ
รูปแบบ
os.rename(current_file_name, new_file_name)
ตัวอย่างที่ 4.8 การเปลี่ยนชื่อแฟ้ม
1 import os
2 # Rename a file from foo.txt to food.txt
3 os.rename( "foo.txt", "food.txt" )
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 79
การลบแฟ้มและสารบบ
การลบแฟ้มและสารบบ โปรแกรมภาษาไพทอนใช้มอดูล os และมีเมท็อดส าหรับลบแฟ้มได้แก่
remove(file) และถ้าต้องการลบสารบบใช้เมท็อด rmdir(directory) ส าหรับวิธีการลบสารบบที่ยังมีแฟ้มอยู่
ภายในนั้น จะไม่สามารถลบได้ จึงต้องใช้ค าสั่งลบแฟ้มให้เสร็จสิ้นก่อน แต่ถ้าหากต้องการลบทั้งสารบบและลบ
แฟ้มทั้งหมดที่อยู่ภายใต้สารบบแล้ว ใช้เมท็อด walk(path)
รูปแบบ
os.remove(file_name)
ตัวอย่างที่ 4.9 การลบแฟ้ม
1 import os
2 # Delete file food.txt
3 os.remove("food.txt")
การจัดการกับข้อมูล
การค้นหาข้อมูล
ตัวอย่างที่ 4.10 การค้นหาข้อมูลในแฟ้ม
1 def searchLine():
2 txtFile = open("info.txt", "r")
3 lineList = [ ]
4 i = 0
5 for line in txtFile:
6 lineList.append(line.rstrip("\n"))
7 if "chiangrai" in lineList[i]:
8 print(lineList[i - 2])
9 i += 1
10
11 searchtLine()
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 80
ตัวอย่างที่ 4.11 การค้นหาข้อมูลในแฟ้ม
1 def searchLine(word):
2 txtFile = open("info.txt", "r")
3 lineList = []
4 i = 0
5 x = 0
6 for line in txtFile:
7 lineList.append(line.rstrip("\n"))
8 if word in lineList[i]:
9 print(lineList[i])
10 break
11 else:
12 x += 1
13 i += 1
14 if x== len(lineList):
15 print("ไม่มี")
16
17 text=input("ป้อนชื่อที่ต้องการค้นหา")
18 searchLine(text)
การเรียงล าดับข้อมูล
การเรียงล าดับข้อมูลใน Python นั้น มีเครื่องมือที่ช่วยอ านวยความสะดวกคือ sorted และ list.sort
ความแตกต่างของสองตัวนี้ คือ sorted จะมองแบบ functional ได้ของใหม่ออกมา (โดยที่ของเก่าไม่เปลี่ยน
ค่า) ส่วน list.sort จะมองแบบ OOP คือเข้าไปเปลี่ยนแปลงการเรียงล าดับในตัว list object
ตัวอย่างที่ 4.12 การเรียกข้อมูลจากน้อยไปหามาก
1 chaos = [4, 1, 0, 3, 2]
2 # functional paradigm
3 print(sorted(chaos))
4 print(chaos)
5 # OOP paradigm
6 chaos.sort()
7 print(chaos)
ผลลัพธ์ที่ได้คือ
[0, 1, 2, 3, 4]
[4, 1, 0, 3, 2]
[0, 1, 2, 3, 4]
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 81
ตัวอย่างที่ 4.13 การเรียกข้อมูลจากมากไปหาน้อย
1 chaos.sort(reverse=True)
2 print(chaos)
ผลลัพธ์ที่ได้คือ
[4, 3, 2, 1, 0]
ตัวอย่างที่ 4.14 การเรียกข้อมูลที่เป็นตัวอักษร
1 letter = ['a', 'b', 'A', 'B']
2 letter.sort()
3 print(letter)
4 letter.sort(key=str.lower)
5 print(letter)
ผลลัพธ์ที่ได้คือ
['A', 'B', 'a', 'b']
['A', 'a', 'B', 'b']
lesson 4 การเขียนโปรแกรมเพื่อจัดการกับข้อมูลอย่างง่าย 82