国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

舉例簡單講解Python中的數(shù)據(jù)存儲模塊shelve的用法

2019-11-25 16:54:00
字體:
供稿:網(wǎng)友

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

import shelvedef test_shelve():  # open 返回一個Shelf類的實例  #  # 參數(shù)flag的取值范圍:  # 'r':只讀打開  # 'w':讀寫訪問  # 'c':讀寫訪問,如果不存在則創(chuàng)建  # 'n':讀寫訪問,總是創(chuàng)建新的、空的數(shù)據(jù)庫文件  #  # protocol:與pickle庫一致  # writeback:為True時,當(dāng)數(shù)據(jù)發(fā)生變化會回寫,不過會導(dǎo)致內(nèi)存開銷比較大  d = shelve.open('shelve.db', flag='c', protocol=2, writeback=False)  assert isinstance(d, shelve.Shelf)  # 在數(shù)據(jù)庫中插入一條記錄  d['abc'] = {'name': ['a', 'b']}  d.sync()  print d['abc']  # writeback是False,因此對value進行修改是不起作用的  d['abc']['x'] = 'x'  print d['abc'] # 還是打印 {'name': ['a', 'b']}  # 當(dāng)然,直接替換key的value還是起作用的  d['abc'] = 'xxx'  print d['abc']  # 還原abc的內(nèi)容,為下面的測試代碼做準(zhǔn)備  d['abc'] = {'name': ['a', 'b']}  d.close()  # writeback 為 True 時,對字段內(nèi)容的修改會writeback到數(shù)據(jù)庫中。  d = shelve.open('shelve.db', writeback=True)  # 上面我們已經(jīng)保存了abc的內(nèi)容為{'name': ['a', 'b']},打印一下看看對不對  print d['abc']  # 修改abc的value的部分內(nèi)容  d['abc']['xx'] = 'xxx'  print d['abc']  d.close()  # 重新打開數(shù)據(jù)庫,看看abc的內(nèi)容是否正確writeback  d = shelve.open('shelve.db')  print d['abc']  d.close()

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

>>> 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,當(dāng)你再次讀取s['x']的時候,s['x']只是一個拷貝,而你沒有將拷貝寫回,所以當(dāng)你再次讀取s['x']的時候,它又從源中讀取了一個拷貝,所以,你新修改的內(nèi)容并不會出現(xiàn)在拷貝中,解決的辦法就是,第一個是利用一個緩存的變量,如下所示

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

在python2.4以后有了另外的方法,就是把open方法的writeback參數(shù)的值賦為True,這樣的話,你open后所有的內(nèi)容都將在cache中,當(dāng)你close的時候,將全部一次性寫到硬盤里面。如果數(shù)據(jù)量不是很大的時候,建議這么做。

下面是一個基于shelve的簡單數(shù)據(jù)庫的代碼

#database.py import sys, shelve  def store_person(db):   """   Query user for data and store it in the shelf object   """   pid = raw_input('Enter unique ID number: ')   person = {}   person['name'] = raw_input('Enter name: ')   person['age'] = raw_input('Enter age: ')   person['phone'] = raw_input('Enter phone number: ')   db[pid] = person  def lookup_person(db):   """   Query user for ID and desired field, and fetch the corresponding data from   the shelf object   """   pid = raw_input('Enter ID number: ')   field = raw_input('What would you like to know? (name, age, phone) ')   field = field.strip().lower()   print field.capitalize() + ':', /     db[pid][field]  def print_help():   print 'The available commons are: '   print 'store :Stores information about a person'   print 'lookup :Looks up a person from ID number'   print 'quit  :Save changes and exit'   print '?   :Print this message'  def enter_command():   cmd = raw_input('Enter command (? for help): ')   cmd = cmd.strip().lower()   return cmd  def main():   database = shelve.open('database.dat')   try:      while True:       cmd = enter_command()       if cmd == 'store':         store_person(database)       elif cmd == 'lookup':         lookup_person(database)       elif cmd == '?':         print_help()       elif cmd == 'quit':         return    finally:     database.close() if __name__ == '__main__': main() 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 若尔盖县| 左云县| 会昌县| 武宣县| 赫章县| 靖州| 铜陵市| 横山县| 海城市| 沙坪坝区| 噶尔县| 科技| 闻喜县| 嵩明县| 休宁县| 巴林左旗| 黄平县| 汪清县| 静宁县| 基隆市| 铜川市| 梁山县| 贡嘎县| 和静县| 稻城县| 乌鲁木齐县| 阿瓦提县| 尼木县| 卫辉市| 梅河口市| 昌图县| 临安市| 濮阳县| 庆阳市| 五大连池市| 眉山市| 和田市| 建水县| 寿光市| 南溪县| 涟源市|