การจัดการไฟล์ (Files)

ความหมายของไฟล์

ไฟล์คือพื้นที่เก็บข้อมูลบนคอมพิวเตอร์ ไฟล์มีหลายประเภทตามการใช้งาน เช่น ไฟล์ Microsoft Word ไฟล์เพลง และไฟล์ VDO เป็นต้น โดยทั่วไปไฟล์มี 2 ประเภท คือ Text files และ Binary files โดย Text files เป็นไฟล์ที่เก็บชุดข้อความซึ่งเปิดอ่านได้ ส่วน Binary files จะอยู่ในรูปแบบของ Binary form เพื่อให้คอมพิวเตอร์ทำงาน

การเขียนโปรแกรมเพื่อใช้งานไฟล์ เช่น อ่านไฟล์ เขียนไฟล์ สร้างไฟล์ และแก้ไขไฟล์ โดยในภาษา Python จะต้องเรียกใช้โมดูล os คือ ระบบปฏิบัติการ (Operating Systems) os module มีความสามารถหลายอย่าง ศึกษาเพิ่มเติมที่ https://docs.python.org/3.5/library/os.html

การทำงานกับ Directories

การเรียกใช้โมดูล os ต้องใช้คำสั่ง import os ก่อนแล้วจะสามารถใช้คำนั่งในโมดูลได้ เช่น ใช้แสดง Directory ที่กำลังทำงานอยู่ ส่วนคำสั่ง os.chdir() คือการเปลี่ยนตำแหน่งการทำงานของ Directory ดังตัวอย่างต่อไปนี้

ฟังก์ชัน os.getcwd() และ os.chdir()
>>> import os
>>> os.getcwd()
'c:\Users\janta\AppData\Local\Programs\Python\Python37-32'
>>> os.chdir('c:\\Users\\janta\\Desktop')

คำสั่งอื่นๆ เช่น

  • os.mkdir('dirname')

  • os.rmdir('dirname')

  • os.remove('filename')

  • os.path.abspath('file.txt')

  • os.path.exists('file.txt')

  • os.path.isdir('file.txt')

  • os.path.isdir(os.getcwd())

  • os.listdir(os.getcwd())

ตัวอย่างผลของคำสั่งในโมดูล os
>>> os.path.isdir(os.getcwd())
True
>>> os.listdir(os.getcwd())
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt',
'python.exe', 'python3.dll', 'python38.dll', 'pythonw.exe',
'Scripts', 'tcl', 'Tools', 'vcruntime140.dll']
>>>

การเปิดไฟล์

ฟังก์ชัน open() มีไว้เพื่อเปิดไฟล์ ก่อนที่จะเริ่มทำงานกับไฟล์ทุกครั้งจะต้องทำการเปิดไฟล์ก่อน โดยมีรูปแบบการเขียนคือ fout = open(filename, flag) ซึ่ง Filename คือ ชื่อไฟล์ที่ต้องการเปิด ส่วน Flag คือ รูปแบบในการเปิดไฟล์ ซึ่งมีหลายแบบ เช่น

  • r ใช้อ่านข้อมูลอย่างเดียว

  • w ใข้เขียนข้อมูลลงในไฟล์ใหม่ที่ไม่ได้สร้างไว้ก่อนหน้า

  • a ใช้เขียนต่อท้ายไฟล์เดิม

และทุกครั้งหลังใช้งานไฟล์เสร็จแล้ว จะต้องทำการปิดไฟล์ด้วยคำสั่ง close() ดังตัวอย่างต่อไปนี้

การสร้างไฟล์
import os
os.chdir('c:\textbackslash\Users\janta\Desktop')
fout = open('file.txt', 'w')
fout.write('The first line. \n')
fout.write('The second line. \n')
fout.write('The thrid line. \n')
fout.close()

การอ่านไฟล์

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

การอ่านไฟล์
fin = open('file02.txt', 'r')
x = fin.read()
fin.close()
print(x)

การจัดการข้อผิดพลาด (Error)

การเขียนโปรแกรมเพื่อให้สามารถจัดการเหตุการณ์ที่คาดไม่ถึงได้ อาทิ เปิดไฟล์ไม่ได้เพราะ Hard disk มีปัญหา หรือ Network มีปัญหา สามารถเขียนโปรแกรมให้แสดง Error message ออกมาได้ โดยใช้ Try and Except statements สำหรับ FileNotFoundError เช่น ในการเปิดไฟล์ที่ยังไม่ได้สร้างไฟล์ไว้ก่อนหน้า แล้วต้องการให้ Error message แสดงออกมาว่า File not found! ดังตัวอย่าง FileNotFoundError ต่อไปนี้

ตัวอย่าง FileNotFoundError
try:
   fin = open('abcdef.txt')
except FileNotFoundError:
   print('File not found.')

ซึ่งได้ผลลัพธ์ดังนี้

ผลลัพธ์ตัวอย่าง FileNotFoundError
>>> File not found.

นอกจากนี้ยังมี finally statement จะทำงานท้ายสุดไม่ว่าจะประสบความสำเร็จหรือไม่ก็ตาม ดังตัวอย่างต่อไปนี้ อ่านเพิ่มเติมเรื่อง Exception Handling ได้ที่ https://docs.python.org/3/library/exceptions.html#bltin-exceptions

Source code ตัวอย่าง Finally statement
try:
   fin = open('file.txt')
except:
   print('File not found.')
finally:
   print('Finally...everything is ok.')

ซึ่งได้ผลลัพธ์ดังนี้

ผลลัพธ์ตัวอย่าง Finally statement
>>> Finally...everything is ok.

ผู้เขียนโปรแกรมสามารถสั่งให้เกิด Exception ขึ้นเองได้ โดยการใช้คำสั่ง raise ตัวอย่าง Raise exception เป็นดังนี้

Source code:

ตัวอย่าง raise exception
def print_james(name):
   if name == 'James':
      print('Hello James.')
   else:
      raise Exception('Name is not James.')

print_james('Jake')

ซึ่งได้ผลลัพธ์ดังนี้

ผลลัพธ์ตัวอย่าง raise exception
Traceback (most recent call last):
   File "C:\_6301.py", line 30, in <module> print_james('Jake')
   File "C:\_6301.py", line 28, in print_james
   raise Exception('Name is not James.')
   Exception: Name is not James.

ฐานข้อมูลแบบ Key-Value

Databases คือ ไฟล์แบบ Binary ที่เก็บข้อมูลในเครื่องคอมพิวเตอร์ที่เก็บในลักษณะ Key และ Value เหมือน Dictionary โดยจะต้องมีการ import โมดูล dbm ก่อนซึ่งเป็นการจัดการเกี่ยวกับ Database และผลลัพธ์ที่ได้จากการอ่านไฟล์ Database จะมีการแสดงตัวอักษร b ไว้ด้านหน้าเพื่อแสดงความเป็น Binary

ตัวอย่าง Key/Value Databases เป็นดังต่อไปนี้

ตัวอย่าง Key/Value Databases
import dbm db = dbm.open('stocks.db', 'c')
db['ptt']='360'
db['scb']='160'
print(db['ptt'])
print(db['scb'])
db.close()

ซึ่งทำให้ได้ผลลัพธ์ดังนี้

ผลลัพธ์ตัวอย่าง Key/Value Databases
>>>
b'360'
b'160'
>>>

การเซฟข้อมูลด้วยการ Pickling

การ Pickling เพื่อเซฟข้อมูลเป็นอย่างอื่นนอกจาก text ดังนั้นให้แปลงอย่างอื่นให้เป็น text แล้วแปลงเป็น object เพื่อดึงกลับขึ้นมา

เริ่มต้นด้วยการ import pickle เช่น ให้ list ชื่อว่า t1 แล้วทำการ dumps(t1) ให้กลายเป็น string ตอนนี้ก็จะสามารถเอา string ไปเก็บในไฟล์ข้อมูลหรือเก็บใน key-value database ก็ได้ และเมื่อต้องการเรียกนำกลับมาใช้ในสภาพเดิมให้ใช้คำสั่ง loads(s) ดังตัวอย่างต่อไปนี้

การ Pickling
>>> import pickle
>>> t = [1,2,3,4,5,6,7]
>>> t
[1,2,3,4,5,6,7]
>>> t1 = t
>>> t1
[1,2,3,4,5,6,7]
>>> s = pickle.dumps(t1)
>>> s
b'\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00]
\x94(K\x01K\x02K\x03K\x04K\x05K\x06K\x07e.'
>>> t2 = pickle.loads(s)
>>> t2
[1, 2, 3, 4, 5, 6, 7]
>>> id(t1)
66507840
>>> id(t2)
63748456

การให้ Python เรียกใช้โปรแกรมอื่น

การให้ Python เรียกใช้โปรแกรมอื่นได้ (Piping) โดยใช้โมดูล os และใช้ฟังก์ชัน popen() อาทิ ตั้งตัวแปรชื่อ cmd เรียกใช้คำสั่ง dir ของ Windows OS ด้วยคำสั่ง popen แล้วนำผลจากคำสั่งนั้นมาเก็บเป็น String ไว้ในตัวแปรชื่อ result

ตัวอย่างการให้ Python เรียกใช้โปรแกรมอื่นได้ เป็นดังต่อไปนี้

ตัวอย่างการให้ Python เรียกใช้โปรแกรมอื่นได้
import os
os.chdir('c:\\users\\janta\\Desktop')
cmd = 'dir'
fp = os.popen(cmd)
result = fp.read()
fp.close()
print(result)

ซึ่งจะได้ผลลัพธ์ดังนี้

ผลลัพธ์ตัวอย่างการให้ Python เรียกใช้โปรแกรมอื่นได้
Volume in drive C has no label.
Volume Serial Number is 2E09-DC35
Directory of c:\users\janta\Desktop
07/05/2020  01:34 PM    <DIR>          .
07/05/2020  01:34 PM    <DIR>          ..
07/03/2020  05:46 PM            52,422 560gra01.png
07/05/2020  01:34 PM            29,887 5f83b4e260d668989b715e8.jpg
07/02/2020  07:04 PM           299,334 latexsheet-a4.pdf
07/03/2020  06:22 PM        14,832,375 Manual_MS-Teams_Full.pdf
07/03/2020  06:11 PM             2,394 Microsoft Teams.lnk
               5 File(s)     15,216,412 bytes
               2 Dir(s)  90,572,718,080 bytes free

แบบฝึกหัด

  1. เขียนฟังก์ชันอ่าน text file ทั้งไฟล์

  2. เขียนฟังก์ชันอ่านไฟล์ n บรรทัดแรกใน text file

  3. เขียนฟังก์ชันอ่านไฟล์ทีละบรรทัดแล้วเก็บไว้ใน list

  4. สร้าง text file ขึ้นมา แล้วเพิ่มบรรทัดใหม่หนึ่งบรรทัดว่า Welcome to my class. แล้ว print เนื้อหาออกมาทั้งหมด