1. 程式人生 > >day5模塊學習--shelve模塊

day5模塊學習--shelve模塊

鍵值 保存 宋體 內部使用 value svi 如果 lis .get

shelve模塊

shelve類似於一個key-value數據庫,可以很方便的用來保存Python的內存對象,其內部使用pickle來序列化數據,簡單來說,使用者可以將一個列表、字典、或者用戶自定義的類實例保存到shelve中,下次需要用的時候直接取出來,就是一個Python內存對象,不需要像傳統數據庫一樣,先取出數據,然後用這些數據重新構造一遍所需要的對象。下面是簡單示例:

shelve存儲數據:

import shelve,datetime

  names = ["alex","tom","tenglan"]
  ages = [18,16,15]
  f = shelve.open("database")
  f["age"] = ages
  f["name"] = names
  f[‘date‘] = datetime.date.today()
  f.close()

上面代碼中,我們使用shelve打開文件並往裏面寫入數據,是以字典形式寫入數據,句柄f相當於字典一樣,往文件添加數據,就跟我們往字典中添加數據的原理是一樣的,如f["age"]=ages,鍵值對。

shelve讀取數據:

import shelve,datetime

f = shelve.open("database")
print(f.keys())
print(f.values())
print(type(f.get("name")))
print(f.get("age"))
print(f.get("date"))
f.close()
運行如下:
KeysView(<shelve.DbfilenameShelf object
at 0x7f0e89a97898>) ValuesView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>) <class list> [18, 16, 15] 2017-07-23

上面代碼,我們把存儲的數據對去出來了,可以看出,讀取出來的數據類型沒有改變,不是字符串,並且文件句柄就是一個字典,存儲在文件句柄中一樣。

shelve模塊打開文件還有一個神奇的地方,就是如果這個文件不存在則創建,如果這個文件存在則讀取。

這個有一個潛在的小問題,如下:

>>> import shelve
  >>> s = shelve.open("test.dat")
  >>> s["x"] = ["a","b","c"]
  >>> s["x"].append("d")
  >>> s["x"]
  [‘a‘, ‘b‘, ‘c‘]

存儲的d到哪裏去了呢?其實很簡單,d沒有寫入,我們把["a","b","c"]存儲到了x,當我們再次讀取s["x"]的時候,s["x"]只是一個拷貝,而我們沒有將拷貝寫回,所以當我們再次讀取s["x"]的時候,它又從源中讀取了一個拷貝,所以,我們新修改的內容並不會出現在拷貝中,解決的辦法就是,第一個是利用一個緩存的變量,如下所示:   >>> import shelve

>>> s = shelve.open("test.dat")
  >>> tmp = ["a","b","c"]
  >>> s["x"] = tmp
  >>> tmp.append("d")
  >>> s["x"] = tmp
  >>> s[‘x‘]
  [‘a‘, ‘b‘, ‘c‘, ‘d‘]
  s.close()

文件寫進去時候是不能直接修改的,就算修改了,也要重新寫進去,這就是文件的要求,不可能修改之後,文件裏面直接改變。

import shelve,datetime

f = shelve.open("database")
print(f.keys())
print(f.values())
print(type(f.get("name")))
print(f.get("age"))
print(f.get("date"))
f.close()

day5模塊學習--shelve模塊