[TH] The MicroPython Internal File System.

บทความนี้เป็นการใช้งานระบบไฟล์ของ MicroPython โดยใช้บอร์ดไมโครคอนโทรลเลอร์  esp8266 และ esp32 เป็นบอร์ดทดลอง ซึ่งการใช้งานระบบไฟล์เกี่ยวข้องกับไดเร็กทอรีและไฟล์ รวมถึงการเชื่อมต่ออุปกรณ์ให้ถูกมองเป็นระบบไฟล์ของ MicroPython เช่น การเชื่อมต่อกับ  SD-Card เพื่อมองเป็นไดเร็กทอรีของระบบ เป็นต้น เป็นการใช้งานคลาส os ส่วนการสร้างไฟล์ เปิด เข้าถึงเพื่ออ่าน เข้าถึงเพื่อเขียนข้อมูล และการปิดการใช้งานไฟล์จะเป็นส่วนของคลาส file ของ MicroPython

คลาส os

รายชื่อเมธอดที่เป็นของคลาส os เป็นดังภาพที่ 1 ซึ่งมีด้วยกันหลายกลุ่มคำสั่ง แต่ในบทความนี้กล่าวถึงคำสั่งที่เกี่ยวข้องกับไดเร็กทอรีและไฟล์ ได้แก่ listdir, mkdir, rmdir, chdir, getcwd, remove และ rename

ภาพที่ 1 รายการเมธอดในคลาส os

listdir()

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

import os
print(os.listdir())
print(os.listdir('/'))
ภาพที่ 2 ตัวอย่างผลลัพธ์ของการใช้ 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'))
ภาพที่ 3 ตัวอย่างผลลัพธ์ของการใช้คำสั่ง mkdir()

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())
ภาพที่ 4 ตัวอย่างผลลัพธ์ของการใช้คำสั่ง chdir()

getcwd()

คำสั่ง getcwd() เป็นคำสั่งสำหรับอ่านค่าตำแหน่งไดเร็กทอรีปัจจุบันที่ใช้งานอยู่ เช่นในตัวอย่าง มีการอ่านค่าตำแหน่งไดเร็กทอรีปัจจุบันเก็บในตัวแปร a หลังจากนั้นทดลองย้ายไปที่ /ex แล้วสั่งรายงานชื่ออีกครั้งดังตัวอย่างภาพที่ 5

a = os.getcwd()
print(a)
os.chdir('/ex')
print(os.getcwd())
ภาพที่ 5 ตัวอย่างการใช้งานคำสั่ง getcwd()

rmdir()

คำสั่ง rmdir() ใช้สำหรับลบไดเร็กทอรีที่ระบุในพารามิเตอร์ เช่นตัวอย่างต่อไปนี้เป็นการลบไดเร็กทอรี b ซึ่งอยู่ในไดเร็กทอรี ex อีกชั้นหนึ่ง หลังจากนั้นสั่งแสดงรายชื่อไฟล์และไดเร็กทอรีใน ex จะพบว่ามีแต่ไดเร็กทอรี a เท่านั้น ดังภาพตัวอย่างที่ 6

os.rmdir('/ex/b')
print(os.listdir('/ex'))
ภาพที่ 6 ตัวอย่างผลลัพธ์จากการใช้ rmdir()

rename()

คำสั่ง rename() ใช้สำหรับเปลี่ยนชื่อของไดเร็กทอรีหรือไฟล์ โดยต้องกำหนดอาร์กิวเมนต์ 2 ตัว ได้แก่

  • ต้นฉบับ
  • ปลายทาง

โดยคำสั่งจะทำการเปลี่ยนชื่อ ‘ต้นฉบับ’ เป็น ‘ปลายทาง’ เช่น ตัวอย่างต่อไปนี้ที่ทำการเปลี่ยนชื่อไดเร็กทอรี จาก /ex/a เป็น /ex/seta ดังนั้น เมื่อสั่งแสดงรายชื่อจะพบชื่อ seta แทน a ดังภาพที่ 7

os.rename('/ex/a','/ex/seta')
print(os.listdir('/ex'))
ภาพที่ 7 ตัวอย่างการใช้คำสั่ง rename()

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('/'))
ภาพที่ 8 ตัวอย่างของการใช้คำสั่ง remove()

คลาสไฟล์

การทำงานของ 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

ภาพที่ 9 ตัวอย่างการทำงานของโปรแกรม SaveDHT2File.py

สรุป

จากบทความนี้จะพบว่าภาษาไพธอนของ MicroPython ทำให้การเขียนโปรแกรมมีความสะดวกยิ่งขึ้น เนื่องจากตัว MicroPython กระทำตัวเหมือนระบบปฏิบัติการขนาดเล็ก ๆ ให้เราเรียกใช้คำสั่งต่าง ๆ และการใช้งานไฟล์ยิ่งทำให้ผู้พัฒนาโปรแกรมนำไปประยุกต์ได้หลากหลาย เช่น จัดเก็บข้อมูลลงไฟล์เป็นการชั่วคราวเมื่อไม่สามารถส่งข้อมูลไปในระบบเครือข่ายได้ หรือ ใช้เป็นล็อกของการทำงานเพื่อนำมาวิเคราะห์การทำงานของโปรแกรมที่เขียนในภายหลัง เป็นต้น สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ

แหล่งอ้างอิง

  1. MicroPython : The Internal filesystem

(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อวันที่ 2021-09-15, 2021-12-01