1. 程式人生 > >少說話多寫程式碼之Python學習063——標準模組(shelve模組)

少說話多寫程式碼之Python學習063——標準模組(shelve模組)

如果我們只需要存少量的資料,一個簡單的儲存方案是使用shelve模版。我們只需要給他提供一個指定路徑的檔名。shelve呼叫過程是,
先呼叫open函式,引數為檔名。返回值是一個shell物件。這個物件可以用來儲存資料,可以作為一個字典來操作,但是鍵一定是字串型別的。操作完成後呼叫close函式。看下shelve的簡單使用,

import  shelve
#引數為檔名,會在當前執行目錄下建立三個檔案
#test.dat.bak
#test.dat.dat
#test.dat.dir
s=shelve.open('test.dat')
s['x'] = ['a','b','c']
s['x'].append('d')
print(s['x'])
輸出
['a', 'b', 'c']

temp=s['x']
temp.append('d')
s['x']=temp
print(s['x'])
輸出
['a', 'b', 'c', 'd']

第一段程式碼中,d不見了,因為當用shell物件查詢元素時,這個物件根據已經儲存的版本進行構建,當給某個鍵時,被儲存了。
上述過程如下,
['a','b','c']賦值給x鍵;
d新增時,當前版本並未儲存;
獲取值時,獲取的是原始版本,因此d不見了。

而第二段,temp是副本,副本修改後,重新儲存了,所以能獲取到d。我們再通過這個例子,看看shelve實現簡單的資料儲存。
如下,使用shelve模版模擬簡單資料庫的使用。

import sys,shelve
def store_person(db):
    """
    Query user for data store it in the shelf object
    """
    pid=input("輸入唯一編碼:")
    person={}
    person['name'] =input('請輸入姓名:')
    person['age']=input('請輸入年齡:')
    person['phone']=input('請輸入電話號碼:')
    db[pid]= person

def lookup_person(db):
        """
          Query user for id and desired field,and fetch the corresponding data form the shelf object
          """
        pid = input('輸入唯一編碼:')
        field=input('以下資訊請輸入:(name,age,phone)')
        field=field.strip().lower()
        print(field.capitalize()+':',\
              db[pid][field])

def print_help():
        print('有效的命令有:')
        print('store: 儲存一個person物件')
        print('lookup: 通過id查詢一個person物件')
        print('quit: 儲存退出')
        print('?:顯示幫助資訊')

def endter_command():
        cmd=input('輸入命令:(按?請求幫助)')
        cmd=cmd.strip().lower()
        return  cmd

def main():
        #此處路徑根據實際的檔案路徑更改,不用提前建立該檔案,會自動建立
        #D:\\work\\Python\\是我本地電腦存在的目錄,大家測試可以自行修改目錄
        database= shelve.open('D:\\work\\Python\\database.dat')
        try:
            while True:
                cmd=endter_command()
                if cmd=='store':
                    store_person(database)
                elif cmd=='lookup':
                    lookup_person(database)
                elif cmd=='?':
                    print_help()
                elif cmd =='quit':
                    return
        finally:
            database.close()
#呼叫
main()

操作輸出如下

輸入命令:(按?請求幫助)?
有效的命令有:
store: 儲存一個person物件
lookup: 通過id查詢一個person物件
quit: 儲存退出
?:顯示幫助資訊
輸入命令:(按?請求幫助)store
輸入唯一編碼:1
請輸入姓名:yangyoushan
請輸入年齡:31
請輸入電話號碼:13011111
輸入命令:(按?請求幫助)lookup
輸入唯一編碼:1
以下資訊請輸入:(name,age,phone)name
Name: yangyoushan
輸入命令:(按?請求幫助)quit

功能檔案下載:https://download.csdn.net/download/yysyangyangyangshan/10860069