1. 程式人生 > >day6 shelve模塊

day6 shelve模塊

size shelve 我們 簡單 log 存在 tro 模塊 反序

shelve模塊

shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊,可以持久化任何pickle可支持的python數據格式,shelve模塊是對pickle模塊的補充。我們知道,如果調用pickle模塊,向文件中dump()字符串的時候,讀取的時候必須一次一次進行load()。

首先,我們使用pickle向文件中寫入信息,來看一下情況:

import pickle

  ufo = {"alex":123,"tom":456}
  l1 = [11,22,33,44]
  with open("file_json","wb") as f:
  pickle.dump(ufo,f) #把字典dump()到文件中
  pickle.dump(l1,f) #把列表dump()到文件中

上面程序,我們向文件"file_json"中寫入了一個字典和一個列表。接下來,我們使用load()來讀取文件中的信息。如下:

import pickle

  with open("file_json","rb") as f:
  a = pickle.load(f) #使用load()反序列化,讀取文件信息
  print(a)

  b = pickle.load(f) #使用load()反序列化,讀取文件信息
  print(b)

運行如下:

{‘alex‘: 123, ‘tom‘: 456}
  [11, 22, 33, 44]

從上面代碼運行的結果可以看出,得到的是上面dump()進去的字典和列表。但是只能一次一次的讀取,遵循先進先出的原則,最先dump()進去的數據也最先load()出來,但是這樣也存在一定的缺陷,比如我想直接取列表的信息,但是由於列表是後面添加進去的,因為只能load()兩次,如何才能直接提取列表呢?shelve模塊就是解決這樣的問題的。

shelve模塊存儲文件信息

import shelve

class func(object):
    def __init__(self,n):
        self.n = n

d = {"alex":"sb","tom":"is
","aoi":"456"} l = ["alex","pipei","erbi"] fun = func(1568) #生成一個類個體 with shelve.open("shelve_test") as f: #使用shelve模塊打開文件 f["fun"] = fun #往shelve模塊中添加變量,以k,v形式進行添加文件信息,首先添加一個類變量 f["d"] = d #添加一個字典 f["l"] = l #添加一個列表

shelve模塊讀取文件信息

import shelve

#讀取
with shelve.open("shelve_test","r") as f:     #使用shelve打開模塊
    a = f.get("d")
    print(a)


    b = f.get("fun")           #指定鍵值對形式獲取存儲信息
    print(b.n)

運行結果如下:

{‘alex‘: ‘sb‘, ‘tom‘: ‘is‘, ‘aoi‘: ‘456‘}
  1568

可以看出,使用shelve模塊,能夠指定命的形式來獲取存儲的信息,不需要按照順序,讓我們使用比較方便,克服了pickle的缺陷,因此,要經常使用shelve模塊進行文件的存儲與讀取。

註意:使用shelve模塊打開文件的方法是open(),shelve.open("file_name"),不需要指定以什麽形式打開,並且讀取文件的時候也是,使用shelve.open()打開文件。要想獲得shelve模塊中的文件信息,要使用get()方法,f.get()來獲取文件中的信息。

day6 shelve模塊