Input/output with files

24 April 2017

ในการเขียนโปรแกรม ไฟล์ (File) คือสิ่งที่ใช้สำหรับเก็บข้อมูลบนคอมพิวเตอร์ในหน่วยเก็บข้อมูล คอมพิวเตอร์มีไฟล์หลากหลายประเภทขึ้นอยู่กับวัตถุประสงค์การใช้งานของมัน โดยทั่วไปแล้วไฟล์จะแบ่งออกเป็น 2 รูปแบบคือ Text file และ Binary file โดย Text file จะเก็บไฟล์ในรูปแบบของชุดตัวอักษรหรือข้อความที่มนุษย์สามารถอ่านเข้าใจได้ ในขณะที่ Binary file เก็บข้อมูลในรูปแบบ Binary form สำหรับคอมพิวเตอร์เพื่อทำงาน ในบทนี้ เราจะพูดถึงการทำงานกับไฟล์เบื้องต้นในภาษา Python

การเปิดไฟล์ ในภาษา Python

ก่อนที่จะเริ่มทำงานกับไฟล์ สิ่งแรกที่คุณต้องทำก็คือต้องเปิดไฟล์ขึ้นมาก่อน ในภาษา Python ใช้ฟังก์ชัน open() สำหรับเปิดไฟล์เพื่อวัตถุประสงค์ที่ต้องการ โดยฟังก์ชันสามารถเปิดเพื่อทำงานได้กับทั้ง Text file และ Binary file นี่เป็นรูปแบบของการใช้งานฟังก์ชันเพื่อเปิดไฟล์

f = open(filename, mode)

โดยที่ filename เป็นชื่อหรือ Path ของไฟล์ที่ต้องการเปิด และ mode เป็นโหมดสำหรับเปิดไฟล์ เช่น เปิดไฟล์เพื่อการอ่านหรือการเขียน เป็นต้น เมื่อการเปิดไฟล์สำเร็จ ฟังก์ชันจะส่งไฟล์ออบเจ็คกลับมาเพื่อนำไปใช้ในการอ่านและเขียนไฟล์ต่อไป สำหรับโหมดในการเปิดไฟล์นั้นมีหลายแบบที่คุณสามารถใช้ได้ นี่เป็นโหมดการเปิดไฟล์ที่ใช้กับฟังก์ชัน open() ในภาษา Python

ModeDescription
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

การอ่านข้อมูลจาก Text file

หลังจากที่คุณได้เรียนรู้เกี่ยวกับฟังก์ชันที่ใช้ในการเปิดไฟล์แล้ว ต่อไปจะเป็นตัวอย่างของการอ่านข้อมูลจากไฟล์ในภาษา 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 ขึ้น

s = f.read()

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

f.close()

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

This is the content in the file
This is a second line

นี่เป็นผลลัพธ์การทำงานของโปรแกรมที่บ่งบอกว่าในไฟล์ myfile.txt ของเรามีข้อมูลดังกล่าวอยู่

และนี่เป็นรูปแบบของโปรแกรมในการใช้งานคำสั่ง with เพื่อเปิดไฟล์ และเราไม่ต้องปิดไฟล์ด้วยเมธอด close() และนี่จะยืนยันว่าไฟล์จะถูกปิดการทำงานเสมอแม้จะเกิดข้อผิดพลาดขึ้นก็ตาม

with open('myfile.txt', 'r') as f:
    s = f.read()

print(s)

การอ่านข้อมูลทีละบรรทัดด้วยเมธอด readline()

ในตัวอย่างก่อนหน้า เมธอด 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 ด้วยโหมดสำหรับการอ่านข้อมูลเช่นเดิม

การอ่านข้อมูลจากไฟล์ ในภาษา Python

นี่เป็นรูปของข้อมูลที่แสดงในไฟล์ myconfig.txt ที่เราจะอ่านโดยโปรแกรมของเรา โดยไฟล์ดังกล่าวเก็บค่าของการตั้งค่าโดยมี Key และ Value และแต่ละค่าจะแบ่งแยกโดยการขึ้นบรรทัดใหม่

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: marcuscode
domain_name: marcuscode.com
year: 2017
type: tutorial
head_color: blue
theme: light

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ในการอ่านข้อมูลจากไฟล์ทีละบรรทัดด้วยเมธอด readline()

การเขียนข้อมูลลงบน Text file

ในการทำงานกับไฟล์ นอกจากการอ่านข้อมูลแล้วยังมีการเขียนข้อมูลลงไปในไฟล์ ในการเขียนโปรแกรมนั้นอาจจะมีข้อมูลบางอย่างที่เราจะต้องเก็บไว้ในรูปแบบของไฟล์ เพื่อนำไปใช้งานในอนาคตหรือใช้กับโปรแกรมอื่นๆ ต่อไปเป็นตัวอย่างของการเขียนข้อมูลลงใน 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

นี่เป็นผลลัพธ์การทำงานของโปรแกรม โดยโปรแกรมถามให้เรากรอกข้อมูลของพนักงานจำนวน 5 คนและบันทึกข้อมูลเหล่านั้นลงไปบนไฟล์ employees.txt และนี่เป็นข้อมูลในไฟล์หลังจากที่การเขียนข้อมูลเสร็จสิ้น

การเขียนข้อมูลลงในไฟล์ ในภาษา Python

การเขียนข้อมูลลงต่อท้ายไฟล์เดิม (File appending)

ในการเขียนข้อมูลลงบนไฟล์ในภาษา 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

นี่เป็นข้อมูลในไฟล์ employees.txt หลังจากการรันโปรแกรมเพื่อเขียนข้อมูลต่อท้ายไฟล์ สังเกตว่าสองบรรทัดสุดท้ายเป็นข้อมูลที่เพิ่มเข้ามาใหม่ โดยที่ข้อมูลที่เขียนไปก่อนหน้ายังมีอยู่

การอ่านและเขียนข้อมูลกับ Binary file

ฺ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

นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการทำงานกับ Binary file ทั้งการอ่านและเขียนข้อมูล

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการทำงานพื้นฐานกับไฟล์ในภาษา Python ทั้งการอ่านและเขียนข้อมูลกับ Text file โดยการใช้โหมดต่างๆ นอกจากนี้ เรายังได้ให้ตัวอย่างของการทำงานกับ Binary file เพื่อเก็บข้อมูลในรูปแบบของ ฺbyte object ลงไปบนไฟล์ และคุณได้ทราบถึงประโยชน์ของการใช้งานไฟล์บนคอมพิวเตอร์กับการเขียนโปรแกรม

บทความนี้เป็นประโยชน์หรือไม่?Yes·No