Programming Python - 1. Preview -1.2 Storing Records Persistently
1. Using formatted files
#test script bob={'name': 'bob smith', 'age': 42, 'pay':30000, 'job':'dev'} sue={'name': 'sue jones', 'age':45,'pay':40000,'job':'hdw'} tom={'name': 'tom', 'age':50, 'pay':0, 'job': None} db={} db['bob']=bob db['sue']=sue db['tom']=tom if __name__=='__main__': for key in db: print(key, "=>", db[key]) ## end if test script
store & load data
dbfilename='people-file' Recsep="=>" Endrec='Endrec' Enddb='Enddb' def storeDbase(db, dbfile=dbfilename): dbfile=open(dbfilename,'w') for key in db: print(key, file=dbfile) for name,value in db[key].items(): #db[key] 为dictionary, dictionary.items() gives the (name, vlaue) list of the dicitonary print(name+Recsep+repr(value), file=dbfile) #repr()---modify the object into spring output print(Endrec, file=dbfile) print(Enddb,file=dbfile) dbfile.close() def loadDbase(dbfilename=dbfilename): dbfile=open(dbfilename) import sys sys.stdin=dbfile db={} key=input() while key!=Enddb: rec={} field=input() while field != Endrec: name, value=field.split(Recsep) rec[name]=eval(value) field=input() db[key]=rec key=input() return db if __name__=="__main__": from initdata import db storeDbase(db)
2. Using Pickle
#make pickle db file from initdata import db import pickle dbfile=open('people-pickle', 'wb') pickle.dump(db, dbfile) dbfile.close #load pickle file import pickle dbfile=open('people-pickle','rb') db=pickle.load(dbfile) for key in db: print (key, "=>\n", db[key]) print(db['sue']['name']) #update pickle file import pickle dbfile=open('people-pickle', 'rb') db=pickle.load(dbfile) dbfile.close() db['sue']['pay'] *= 1.1 db['tom']['name']='tom tom' dbfile=open('people-pickle','wb') pickle.dump(db, dbfile) dbfile.close()
3. Per-record Pickle Files
from initdata import bob, sue, tom import pickle for (key, record) in [('bob', bob), ('sue', sue), ('tom', tom)]: recfile=open(key+".pkl",'wb') pickle.dump(record, recfile) recfile.close() import pickle, glob for filename in glob.glob('*.pkl'): dbfile=open(filename,'rb') record=pickle.load(dbfile) print(filename,'=>\n',record) dbfile.close() suefile=open('sue.pkl','rb') print(pickle.load(suefile)['name'])
4. Using Shelves
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写
shelves provide utility similar to per-record pickle files, but they are usually easier to code.
#make db shelve from initdata import bob, sue import shelve db=shelve.open('people-shelve') db['sue']=sue db['bob']=bob db.close() #dump db shelve import shelve db=shelve.open('people-shelve') for key in db: print(key,"=>\n", db[key]) print(db['sue']['name']) db.close() #update db shelve #1)fetch data #2)update in memory #3) reassign to the key/data from initdata import tom import shelve db=shelve.open('people-shelve') sue=db['sue'] #fetch data sue['pay']*=1.5 #update in memory db['sue']=sue #reassign db['tom']=tom db.close()