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()
posted @ 2014-02-22 14:41  yjjsdu  阅读(364)  评论(0编辑  收藏  举报