資料儲存

Pico 有 2MB 的快閃記憶體,若想要將資料儲存起來可以直接使用 MicroPython 的檔案存取函數(這部分功能跟 Python 一樣)。雖然從 MicroPython 的文件中可以看到 btree 這一個模組,他是專門用來存取資料到檔案中的一個模組,格式為 key-value 型態。可惜目前 Pico 或 Pico W 的韌體預設還沒有加進去,需要自己下載原始碼並在編譯前打開這個功能。事情不需要搞這麼複雜,我們用標準的檔案存取方式就好了。

這裡簡單設計一個類別,使用 key-value 形式存取資料,檔名也不用傷腦筋,類別內部已經直接指定並且為隱藏檔,所以在 Thonny 的檔案列表中是看不到的,以免誤刪。如果需要,可以在 Thonny 的檔案列表上按滑鼠右鍵後選擇「顯示隱藏檔」就可以看到檔名為 .storage 的檔案。

若使用預設的檔名存取資料,整個 Pico 中所有專案都共享同一個檔案,也就是 .storage 這個檔。如果希望指定檔名也可以,這樣儲存的資料就會存到特定檔案中,不會跟其他專案共享了。

程式碼如下,建議檔名為 mstorage.py 並且存到 /lib 資料夾下。

### Created by KoKang Chu

import ujson

class Storage:
    __instance__ = None
    
    @staticmethod
    def getInstance():
        if Storage.__instance__ == None:
            Storage.__instance__ = Storage(filename='/.storage')
        return Storage.__instance__
    
    def __init__(self, filename):
        self.__filename__ = filename
        try:
            with open(self.__filename__, 'r') as f:
                self.__data__ = ujson.loads(f.read())
        except:
            self.__data__ = {}
            
    def get(self, key):
        try:
            return self.__data__[key]
        except KeyError:
            return None
    
    def set(self, key, value):
        self.__data__[key] = value
        self.__save__()

    def remove(self, key):
        try:
            del self.__data__[key]
            self.__save__()
        except KeyError:
            pass
            
    def __save__(self):
        with open(self.__filename__, 'w') as f:
            f.write(ujson.dumps(self.__data__))
            f.flush()

存取資料

import mstorage

storage = mstorage.Storage.getInstance()
# save data
storage.set('temperature', 56)
# load data
temp = storage.get('temperature')
print(temp)  # Prints 56

若儲存的資料中找不到指定的 key 時會傳回 None。

刪除資料

import mstorage

storage = mstorage.Storage.getInstance()
# remove data
storage.remove('temperature')
# load data
temp = storage.get('temperature')
print(temp) # Prints None

指定檔名

如果不希望儲存的資料放在 Pico 的 .storage 檔案中,我們可以單獨設定儲存資料的檔案,如下,這時資料就會儲存在檔名為 mydata 這個檔案了。

import mstorage

storage = mstorage.Storage('mydata')
storage.set('degree', 40)

★本系列收錄於「第一次就上手」選單

發表迴響