บทความนี้เป็นการใช้งานระบบไฟล์ของ MicroPython โดยใช้บอร์ดไมโครคอนโทรลเลอร์ esp8266 และ esp32 เป็นบอร์ดทดลอง ซึ่งการใช้งานระบบไฟล์เกี่ยวข้องกับไดเร็กทอรีและไฟล์ รวมถึงการเชื่อมต่ออุปกรณ์ให้ถูกมองเป็นระบบไฟล์ของ MicroPython เช่น การเชื่อมต่อกับ SD-Card เพื่อมองเป็นไดเร็กทอรีของระบบ เป็นต้น เป็นการใช้งานคลาส os ส่วนการสร้างไฟล์ เปิด เข้าถึงเพื่ออ่าน เข้าถึงเพื่อเขียนข้อมูล และการปิดการใช้งานไฟล์จะเป็นส่วนของคลาส file ของ MicroPython
คลาส os
รายชื่อเมธอดที่เป็นของคลาส os เป็นดังภาพที่ 1 ซึ่งมีด้วยกันหลายกลุ่มคำสั่ง แต่ในบทความนี้กล่าวถึงคำสั่งที่เกี่ยวข้องกับไดเร็กทอรีและไฟล์ ได้แก่ listdir, mkdir, rmdir, chdir, getcwd, remove และ rename
listdir()
คำสั่งสำหรับแสดงรายการไดเร็กทอรีและไฟล์คือ listdir() โดยการใช้สามารถเรียกใช้โดยไม่ต้องกำหนดอาร์กิวเมนต์หรือพารามิเตอร์ หรือระบุไดเร็กทอรีที่ต้องการดู เช่นโค้ดด้านล่างนี้เป็นการสั่งให้แสดงรายชื่อไดเร็กทอรีและไฟล์ในที่อยู่ปัจจุบัน กับสั่งให้แสดงรายการที่อยู่ที่ไดเร็กทอรีราก หรือ / และตัวอย่างผลลัพธ์เป็นดังภาพที่ 2
import os
print(os.listdir())
print(os.listdir('/'))
mkdir()
คำสั่ง mkdir ใช้สำหรับสร้างไดเร็กทอรี โดยระบุชื่อของไดเร็กทอรีหรือพาธ (path) เป็นอาร์กิวเมนต์ของคำสั่ง เช่นตัวอย่างต่อไปนี้เป็นการสร้างไดเร็กทอรี ex ให้อยู่ที่ราก (/) หลังจากนั้นสร้างไดเร็กทอรี a และ b ให้อยู่ใน ex อีกชั้นหนึ่ง ซึ่งผลลัพธ์การทำงานเป็นดังภาพที่ 3
os.mkdir('/ex')
os.mkdir('/ex/a')
os.mkdir('/ex/b')
print(os.listdir())
print(os.listdir('/ex'))
chdir()
คำสั่ง chdir() ใช้สำหรับย้ายตำแหน่งของไดเร็กทอรีทำงานปัจจุบันไปยังตำแหน่งที่ต้องการ โดยระบุชื่อของไดเร็กทอรีที่ต้องการเป็นอาร์กิวเมนต์ของคำสั่ง และมีเครื่องหมายบางประการที่กำหนดเอาไว้พิเศษสำหรับการอ้างอิงเกี่ยวกับไดเร็กทอรี คือ
- . แทนไดเร็กทอรีปัจจุบัน
- / แทนไดเร็กทอรีราก
- .. แทนไดเร็กทอรีก่อนหน้านี้
ตัวอย่างโปรแกรมการใช้งานเป็นดังนี้ และผลลัพธ์ของการทำงานเป็นดังภาพที่ 4
os.chdir('/ex')
print(os.listdir())
os.chdir('./a')
print(os.listdir())
os.chdir('..')
print(os.listdir())
os.chdir('/')
print(os.listdir())
getcwd()
คำสั่ง getcwd() เป็นคำสั่งสำหรับอ่านค่าตำแหน่งไดเร็กทอรีปัจจุบันที่ใช้งานอยู่ เช่นในตัวอย่าง มีการอ่านค่าตำแหน่งไดเร็กทอรีปัจจุบันเก็บในตัวแปร a หลังจากนั้นทดลองย้ายไปที่ /ex แล้วสั่งรายงานชื่ออีกครั้งดังตัวอย่างภาพที่ 5
a = os.getcwd()
print(a)
os.chdir('/ex')
print(os.getcwd())
rmdir()
คำสั่ง rmdir() ใช้สำหรับลบไดเร็กทอรีที่ระบุในพารามิเตอร์ เช่นตัวอย่างต่อไปนี้เป็นการลบไดเร็กทอรี b ซึ่งอยู่ในไดเร็กทอรี ex อีกชั้นหนึ่ง หลังจากนั้นสั่งแสดงรายชื่อไฟล์และไดเร็กทอรีใน ex จะพบว่ามีแต่ไดเร็กทอรี a เท่านั้น ดังภาพตัวอย่างที่ 6
os.rmdir('/ex/b')
print(os.listdir('/ex'))
rename()
คำสั่ง rename() ใช้สำหรับเปลี่ยนชื่อของไดเร็กทอรีหรือไฟล์ โดยต้องกำหนดอาร์กิวเมนต์ 2 ตัว ได้แก่
- ต้นฉบับ
- ปลายทาง
โดยคำสั่งจะทำการเปลี่ยนชื่อ ‘ต้นฉบับ’ เป็น ‘ปลายทาง’ เช่น ตัวอย่างต่อไปนี้ที่ทำการเปลี่ยนชื่อไดเร็กทอรี จาก /ex/a เป็น /ex/seta ดังนั้น เมื่อสั่งแสดงรายชื่อจะพบชื่อ seta แทน a ดังภาพที่ 7
os.rename('/ex/a','/ex/seta')
print(os.listdir('/ex'))
remove()
คำสั่ง remove() ใช้สำหรับลบไฟล์หรือไดเร็กทอรีที่กำหนดเช่นด้านล่างได้ทำการลบไดเร็กทอรี /ex/seta หลังจากนั้นทำการลบไฟล์ /main.py จึงได้ผลลัพธ์ของการทำงานดังภาพที่ 8
os.remove('/ex/seta')
>>> print(os.listdir('/ex'))
[]
>>> print(os.listdir('/'))
['boot.py', 'ex', 'main.py', 'testIO.py']
>>> os.remove('/main.py')
>>> print(os.listdir('/'))
คลาสไฟล์
การทำงานของ MicroPython ในไมโครคอนโทรลเลอร์ esp32/esp8266 รองรับการบริการไฟล์แบบ FAT และ littlefs v2 ทำให้ผู้เขียนโปรแกรมสามารถใช้คำสั่งเกี่ยวกับไฟล์แบบข้อความซึ่งใช้ในบทความนี้ได้แก่
- open()
- close()
- write()
- read()
การเปิดใช้งานไฟล์ต้องมีการสร้างวัตถุสำหรับอ้างอิงถึงไฟล์นั้นตามรูปแบบการสร้างต่อไปนี้
วัตถุไฟล์ = open(ชื่อไฟล์, รูปแบบของการเปิด)
รูปแบบของการเปิดมีดังนี้
- w สำหรับสร้าง
- r สำหรับอ่าน
- a สำหรับเขียนเพิ่มเติม
การปิดการใช้งานไฟล์ที่เปิดไว้ใช้คำสั่ง close() ตามรูปแบบดังนี้
วัตถุไฟล์.close()
การอ่านใช้คำสั่ง read() เพื่ออ่านข้อมูลจากไฟล์ขึ้นมาทั้งหมดมีรูปแบบการใช้งานดังนี้
ข้อมูล = วัตถุไฟล์.read()
และการเขียนข้อมูลลงในไฟล์ทำได้ด้วยคำสั่ง write() คือ
วัตถุไฟล์.write( ข้อมูล )
ตัวอย่างการใช้งาน
ตัวอย่างโปรแกรมต่อไปนี้เป็นการสร้างล็อกไฟล์ (Log file) สำหรับเก้บค่าอุณหภูมิและความชื้นจากเซ็นเซอร์ DHT22 โดยเก็บผลลัพธ์ลงไฟล์ชื่อ dht22log.txt และเป็นการเขียนต่อจากข้อมูลเก่า
#############################################
# SaveDHT2File.py
# (C) 2021, JarutEx
# 2021-09-15
#############################################
import os
import dht
from machine import Pin
dht22 = dht.DHT22(Pin(15))
filename = 'dht22log.txt'
if (filename in os.listdir()):
f = open(filename,'a')
else:
f = open(filename,'w')
dht22.measure()
print("Write...")
f.write("Temperature ....: {}C, Humidity .......: {}%\n".format(
dht22.temperature(),
dht22.humidity())
)
f.close()
print("Read...")
f = open(filename,'r')
print(f.read())
f.close()
ตัวอย่างผลลัพธ์ของโปรแกรมเป็นดังภาพที่ 9
สรุป
จากบทความนี้จะพบว่าภาษาไพธอนของ MicroPython ทำให้การเขียนโปรแกรมมีความสะดวกยิ่งขึ้น เนื่องจากตัว MicroPython กระทำตัวเหมือนระบบปฏิบัติการขนาดเล็ก ๆ ให้เราเรียกใช้คำสั่งต่าง ๆ และการใช้งานไฟล์ยิ่งทำให้ผู้พัฒนาโปรแกรมนำไปประยุกต์ได้หลากหลาย เช่น จัดเก็บข้อมูลลงไฟล์เป็นการชั่วคราวเมื่อไม่สามารถส่งข้อมูลไปในระบบเครือข่ายได้ หรือ ใช้เป็นล็อกของการทำงานเพื่อนำมาวิเคราะห์การทำงานของโปรแกรมที่เขียนในภายหลัง เป็นต้น สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
- MicroPython : The Internal filesystem
(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อวันที่ 2021-09-15, 2021-12-01