ในการเขียนโปรแกรม ไฟล์ (File) คือสิ่งที่ใช้สำหรับเก็บข้อมูลบนคอมพิวเตอร์ในหน่วยเก็บข้อมูล คอมพิวเตอร์มีไฟล์หลากหลายประเภทขึ้นอยู่กับวัตถุประสงค์การใช้งานของมัน โดยทั่วไปแล้วไฟล์จะแบ่งออกเป็น 2 รูปแบบคือ Text file และ Binary file โดย Text file จะเก็บไฟล์ในรูปแบบของชุดตัวอักษรหรือข้อความที่มนุษย์สามารถอ่านเข้าใจได้ ในขณะที่ Binary file เก็บข้อมูลในรูปแบบ Binary form สำหรับคอมพิวเตอร์เพื่อทำงาน ในบทนี้ เราจะพูดถึงการทำงานกับไฟล์เบื้องต้นในภาษา Python
ก่อนที่จะเริ่มทำงานกับไฟล์ สิ่งแรกที่เราต้องทำก็คือต้องเปิดไฟล์ขึ้นมาก่อน ในภาษา Python ใช้ฟังก์ชัน open() สำหรับเปิดไฟล์เพื่อวัตถุประสงค์ที่ต้องการ โดยฟังก์ชันสามารถเปิดเพื่อทำงานได้กับทั้ง Text file และ Binary file นี่เป็นรูปแบบของการใช้งานฟังก์ชันเพื่อเปิดไฟล์
f = open(filename, mode)
โดยที่ filename เป็นชื่อหรือ Path ของไฟล์ที่ต้องการเปิด และ mode เป็นโหมดสำหรับเปิดไฟล์ เช่น เปิดไฟล์เพื่อการอ่านหรือการเขียน เป็นต้น เมื่อการเปิดไฟล์สำเร็จ ฟังก์ชันจะส่งไฟล์ออบเจ็คกลับมาเพื่อนำไปใช้ในการอ่านและเขียนไฟล์ต่อไป
r
w
a
r+
w+
a+
b
เปิดไฟล์เพื่ออ่านข้อมูลจากไฟล์
เปิดไฟล์เพื่อเขียนข้อมูลลงบนไฟล์
เปิดไฟล์เพื่อเขียนข้อมูลต่อท้ายไฟล์เดิม
เปิดไฟล์เพื่ออ่านและเขียนข้อมูล
เปิดไฟล์เพื่ออ่านและเขียนข้อมูล ถ้าหากมีไฟล์เดิมอยู่โปรแกรมจะเขียนทับ
เปิดไฟล์เพื่อเขียนข้อมูลต่อท้ายและอ่านข้อมูลจากไฟล์ ถ้าหากไม่มีไฟล์อยู่จะสร้างไฟล์ใหม่
เปิดไฟล์ใน Binary mode เช่น rb wb ab rb+ wb+ หรือ ab+
โดยปกติแล้วในการทำงานกับไฟล์สามารถมีข้อผิดพลาดเกิดขึ้นได้ และนั่นจะทำให้โปรแกรมหยุดการทำงานในทันที ส่งผลให้ File object ไม่ถูกปิดอย่างถูกต้อง ในภาษา Python เราสามารถใช้งานไฟล์กับคำสั่ง with เพื่อยืนยันว่า File object จะถูกปิดการใช้งานเสมอไม่ว่าจะเกิดข้อผิดพลาดหรือไม่ก็ตาม นี่เป็นตัวอย่าง
with open(filename, mode) as f:
# file operations
หลังจากที่เราได้เรียนรู้เกี่ยวกับฟังก์ชันที่ใช้ในการเปิดไฟล์แล้ว ต่อไปจะเป็นตัวอย่างของการอ่านข้อมูลจากไฟล์ในภาษา Python เราจะเขียนโปรแกรมในการอ่านข้อมูลจาก Text file และนำข้อมูลที่อ่านได้มาแสดงผลทางหน้าจอ นี่เป็นโค้ดของโปรแกรมในการอ่านข้อมูลจาก Text file
f = open('myfile.txt', 'r')
s = f.read()
f.close()
print(s)
ในตัวอย่าง เป็นโปรแกรมในการอ่านข้อมูลจาก Text file ในตอนแรกของโปรแกรม เราได้เปิดไฟล์ด้วยฟังก์ชัน open() โดยอาร์กิวเมนต์แรกเป็นชื่อของไฟล์คือ myfile.txt และเราต้องการเปิดไฟล์เพื่ออ่านจึงใส่โหมดของการเปิดเป็น r หลังจากการเปิดสำเร็จฟังก์ชันส่ง File object กลับในตัวแปร f อย่างไรก็ตาม ถ้าหากการเปิดไฟล์ล้มเหลวจะทำให้เกิดข้อผิดพลาด OSError ขึ้น
f = open('myfile.txt', 'r')
s = f.read()
f.close()
print(s)
s = f.read()
คำสั่งต่อมา เป็นการอ่านข้อมูลจากไฟล์ด้วยเมธอด read() โดยเมธอดนี้จะทำการอ่านข้อมูลทั้งหมดในไฟล์เพียงครั้งเดียว และข้อมูลที่อ่านได้จะเป็น String และเรานำใส่ในตัวแปร s เพื่อนำไปใช้งานต่อไป
f.close()
ในคำสั่งต่อมา เป็นการปิดการทำงานของไฟล์ด้วยเมธอด close() นี่เป็นสิ่งที่สำคัญและคุณควรจะจำไว้เสมอว่า ในการทำงานกับไฟล์ทุกครั้งนั้นจะต้องทำการปิดการทำงานของ File object เสมอ เพื่อให้ไฟล์สามารถใช้ได้กับโปรแกรมอื่นๆ ต่อไป หลังจากนั้นเราแสดงข้อมูลที่อ่านมาได้จากไฟล์
เมื่อรันโปรแกรมจะได้ผลลัพธ์ ดังนี้
This is the content in the file
This is a second line
นี่เป็นรูปแบบของโปรแกรมในการใช้งานคำสั่ง with เพื่อเปิดไฟล์ และเราไม่ต้องปิดไฟล์ด้วยเมธอด close() และนี่จะยืนยันว่าไฟล์จะถูกปิดการทำงานเสมอแม้จะเกิดข้อผิดพลาดขึ้นก็ตาม
with open('myfile.txt', 'r') as f:
s = f.read()
print(s)
เมธอด read() จะทำการอ่านข้อมูลทั้งหมดมาในครั้งเดียว ในภาษา Python นั้นคุณสามารถอ่านข้อมูลจากไฟล์ทีละบรรทัดได้โดยการใช้เมธอด readline() ต่อไปเป็นตัวอย่างของโปรแกรมในการอ่านข้อมูลจาก Text file ทีละบรรทัด โดยการใช้คำสั่ง While loop เพื่อวนอ่านข้อมูลจากไฟล์ นี่เป็นโค้ดการทำงานของโปรแกรม
f = open('myconfig.txt', 'r')
while True:
s = f.readline()
if s == '': # check file end
break
# spliting line to key and value
d = s.rstrip().split('=');
print(d[0] + ': ' + d[1])
f.close()
ในตัวอย่าง เป็นโปรแกรมในการอ่านข้อมูลจากไฟล์ทีละบรรทัดด้วยเมธอด readline() ในตอนแรกเราทำการเปิดไฟล์ myconfig.txt ด้วยโหมดสำหรับการอ่านข้อมูลเช่นเดิม
file myconfig.txt - Notepad
name = twk
domain = num = thoengwit.ac.th
year = 2018
type = tutorial
head_color = blue
นี่เป็นรูปของข้อมูลที่แสดงในไฟล์ myconfig.txt ที่เราจะอ่านโดยโปรแกรมของเรา โดยไฟล์ดังกล่าวเก็บค่าของการตั้งค่าโดยมี Key และ Value และแต่ละค่าจะแบ่งแยกโดยการขึ้นบรรทัดใหม่
while True:
s = f.readline()
if s == '': # check file end
break
while True:
s = f.readline()
if s == '': # check file end
break
หลังจากนั้นโปรแกรมจะทำการวนอ่านไฟล์ด้วยคำสั่ง While loop แต่ละรอบของการทำงานเมธอด readline() จะอ่านข้อมูลจากไฟล์มาทีละบรรทัดโดยรวม \n ด้วย เราได้ใช้คำสั่ง If เพื่อตรวจสอบหากข้อมูลที่อ่านได้เป็นค่า String ว่าง ' ' หมายถึงโปรแกรมได้อ่านไฟล์หมดแล้วและสั่งให้โปรแกรมออกจาก Loop ไป
# spliting line to key and value
d = s.rstrip().split('=');
print(d[0] + ': ' + d[1])
การอ่านข้อมูลในแต่ละรอบนั้นจะอยู่ในตัวแปร s เราได้ทำการตัด New line ออกไปด้วยเมธอด rstrip() และใช้เมธอด split() เพื่อแบ่งเอาค่าของ Key และ Value ของการตั้งค่าที่แบ่งแยกโดยเครื่องหมายเท่ากับ (=) และนำมาแสดงผลโดยจัดรูปแบบการแสดงผลใหม่
เมื่อรันโปรแกรมจะได้ผลลัพธ์ ดังนี้
name = twk
domain = num = thoengwit.ac.th
year = 2018
type = tutorial
head_color = blue
ในการทำงานกับไฟล์ นอกจากการอ่านข้อมูลแล้วยังมีการเขียนข้อมูลลงไปในไฟล์ ในการเขียนโปรแกรมนั้นอาจจะมีข้อมูลบางอย่างที่เราจะต้องเก็บไว้ในรูปแบบของไฟล์ เพื่อนำไปใช้งานในอนาคตหรือใช้กับโปรแกรมอื่นๆ ต่อไปเป็นตัวอย่างของการเขียนข้อมูลลงใน Text file ในภาษา Python โดยโปรแกรมของเราจะทำการบันทึกข้อมูลของพนักงานโดยมีชื่อและภาษาโปรแกรมที่เขียนโดยรับค่าเหล่านี้มาจากคีย์บอร์ด และบันทึกข้อมูลเหล่านั้นไว้ในไฟล์ นี่เป็นโค้ดการทำงานของโปรแกรม
f = open('employees.txt', 'w')
for i in range(1, 6):
print('Employee', i)
name = input('Name: ')
language = input('Language: ')
f.write(name + ', ' + language + '\n')
print('Writing to file completed')
f.close()
ในตัวอย่าง เป็นโปรแกรมเขียนข้อมูลลงบนไฟล์โดยโปรแกรมจะรับข้อมูลจากคีย์บอร์ด ในตอนแรกเราได้ทำการเปิดไฟล์ employees.txt เพื่อเขียนข้อมูลใหม่โดยการใช้โหมด w ในโหมดนี้ถ้าหากไม่มีไฟล์ดังกล่าวอยู่โปรแกรมจะสร้างไฟล์ขึ้นมาใหม่ หรือหากมีอยู่จะทำการลบไฟล์เดิมและสร้างใหม่
for i in range(1, 6):
print('Employee', i)
name = input('Name: ')
language = input('Language: ')
f.write(name + ', ' + language + '\n')
หลังจากการเปิดไฟล์เสร็จเรียบร้อยแล้ว เราใช้คำสั่ง For loop ในการวนอ่านข้อมูลของพนักงานจำนวน 5 คน โดยมีชื่อและภาษาโปรแกรมที่เขียนจากทางคีย์บอร์ด หลังจากได้ข้อมูลแล้วเราใช้เมธอด write() เพื่อเขียน String ลงไปบนไฟล์และจัดรูปแบบของ String โดยคั่นข้อมูลแต่ละแบบด้วยเครื่องหมายคอมมา (,) โปรแกรมวนอ่านค่าและบันทึกข้อมูลจนครบ 5 รอบและออกจาก Loop และเราปิดไฟล์หลังจากที่เขียนเสร็จด้วยเมธอด close()
เมื่อรันโปรแกรมจะได้ผลลัพธ์ ดังนี้
Employee 1
Name: Mateo
Language: Python
Employee 2
Name: Thomas
Language: Java
Employee 3
Name: James
Language: PHP
Employee 4
Name: Danny
Language: Python
Employee 5
Name: Matthew
Language: Scala
Writing to file completed
ในการเขียนข้อมูลลงบนไฟล์ในภาษา Python นั้นมีหลายโหมดด้วยกัน โดยปกติแล้วในโหมด w โปรแกรมจะสร้างไฟล์ขึ้นมาใหม่สำหรับการเขียนเสมอ สำหรับการเขียนข้อมูลแบบต่อท้ายไฟล์เดิมนั้น เราสามารถทำได้โดยการเปิดไฟล์ในโหมด a มาดูตัวอย่าง
f = open('employees.txt', 'a')
f.write('Johnny, PHP\n')
f.write('Lucas, Java\n')
f.close()
เป็นโปรแกรมในการเขียนข้อมูลต่อท้ายไฟล์เดิม จากในไฟล์ก่อนหน้า employees.txt เราได้เขียนข้อมูลของพนักงานลงไปในไฟล์แล้ว 5 คน (หรือ 5 บรรทัด) ในโปรแกรมนี้เป็นการเขียนข้อมูลเพิ่มลงไปอีก 2 บรรทัด
เมื่อรันโปรแกรมจะได้ผลลัพธ์ ดังนี้
Mateo, Python
Thomas, Java
James, PHP
Danny, Python
Matthew, Scala
Johnny, PHP
Lucas, Java
Binary file เป็นรูปแบบหนึ่งของไฟล์ในคอมพิวเตอร์ที่ไม่ได้เก็บข้อมูลในรูปแบบของ Text file แต่ข้อมูลของ Binary file จะเก็บข้อมูลในรูปแบบของตัวเลขฐานสอง ในภาษา Python เราสามารถทำงานกับ Binary file ด้วยการเปิดไฟล์ในโหมด b ต่อมาดูตัวอย่างในการอ่านและเขียนข้อมูลกับ Binary file ในภาษา Python
# writing to binary file
f = open('data', 'wb')
f.write(b'marcuscode')
f.close()
# reading from binary file
f = open('data', 'rb')
print(f.read(3))
print(f.read(3))
print(f.read(4))
f.seek(0)
print(f.read(1))
f.seek(-4, 2)
print(f.read())
f.close()
เป็นโปรแกรมในการเขียนข้อมูลลงไปใน Binary file โปรแกรมได้แบ่งออกเป็นสองส่วน ในส่วนแรกเป็นการเขียนข้อมูลลงไปในไฟล์ เราได้เปิดไฟล์ที่มีชื่อว่า data ในโหมด wb เป็นโหมดสำหรับเขียนข้อมูลลงใน Binary file เราได้ทำการเขียนข้อมูลในรูปแบบของ byte-array ลงไปบนไฟล์โดยมีเนื้อหาว่า b'marcuscode' โดยข้อมูลแต่ละตัวใน byte-array เรียกว่า byte object
หลังจากการเขียนข้อมูลลงใน Binary file เสร็จสิ้นแล้ว ในส่วนต่อมาเป็นการอ่านข้อมูลจากไฟล์ที่เราพึ่งได้เขียนไป เราได้เปิดไฟล์เดิมในโหมด rb เป็นโหมดสำหรับอ่านข้อมูลใน Binary file หลังจากเปิดเสร็จสิ้น เราได้ใช้เมธอด read() เพื่ออ่านข้อมูลโดยมีอาร์กิวเมนต์เป็นจำนวน byte ที่ต้องการอ่าน หลังจากอ่านข้อมูลเสร็จ File pointer จะชี้ไปยังตำแหน่งต่อไปเพื่อที่จะอ่าน
f.seek(0)
หลังจากที่เราได้อ่านข้อมูลไป 3 ครั้งด้วยขนาด 3 3 และ 4 bytes ตามลำดับ ทำให้ File pointer ในตอนนี้ชี้อยู่ที่จำแหน่งที่ 11 เมธอด seek() ใช้สำหรับเลื่อนตำแหน่งของ File pointer ไปยังตำแหน่งที่ต้องการ เราได้เลื่อนไปยังตำแหน่ง 0 ซึ่งเป็นตำแหน่งเริ่มต้นของไฟล์ และการใส่ค่าตำแหน่งเป็นลบ เป็นการอ้างอิงจากจุดสุดท้ายของไฟล์
เมื่อรันโปรแกรมจะได้ผลลัพธ์ ดังนี้
b'mar'
b'cus'
b'code'
b'm'
b'code