1.使用dbm作为持久化字典
#!/usr/bin/python
#coding:utf-8
'''用持久字典来存储名称/值对
数据是在磁盘读取和写入的
dbm的键和值必须是字符串类型'''
#三个实体items(物品信息)、members(成员信息)、loans(租借信息)
#创建一个LendyDB DBM数据库(三个DBM文件)
import dbm
# ID, Name, Description, OwnerID, Price, Condition, DateRegistered
items = [
['1','Lawnmower','Tool','1','$150','Excellent','2012-01-05'],
['2','Lawnmower','Tool','2','$370','Fair','2012-04-01'],
['3','Bike','Vehicle','3','$200','Good','2013-03-22'],
['4','Drill','Tool','4','$100','Good','2013-10-28'],
['5','Scarifier','Tool','5','$200','Average','2013-09-14'],
['6','Sprinkler','Tool','1','$80','Good','2014-01-06']
]
# ID, Name, Email
members = [
['1', 'Fred', 'fred@lendylib.org'],
['2', 'Mike', 'mike@gmail.com'],
['3', 'Joe', 'joe@joesmail.com'],
['4', 'Rob', 'rjb@somcorp.com'],
['5', 'Anne', 'annie@bigbiz.com'],
]
# ID, ItemID(对应items ID), BorrowerID(对应members ID), DateBorrowed, DateReturned
loans = [
['1','1','3','4/1/2012','4/26/2012'],
['2','2','5','9/5/2012','1/5/2013'],
['3','3','4','7/3/2013','7/22/2013'],
['4','4','1','11/19/2013','11/29/2013'],
['5','5','2','12/5/2013','None']
]
def createDB(data,dbName):
try:
db = dbm.open(dbName,'c')
for datum in data:
key = datum[0]
db[key] = ','.join(datum) #使用第一个字段(ID)作为主键且所有字段用','分割
# print(key) #打印键
# print(db[datum[0]]) #打印值
finally:
db.close()
print(dbName,'created')
def readDB(dbName):
try:
db = dbm.open(dbName,'r')
print('Reading ',dbName)
return [db[key] for key in db.keys()]#通过键,返回一个数据列表
finally:
db.close()
def main1():
print('Creating data files...')
createDB(items,'itemdb')
createDB(members,'memberdb')
createDB(loans,'loandb')
print('Reding data files...')
print(readDB('itemdb'))
print(readDB('memberdb'))
print(readDB('loandb'))
def main2():
items = dbm.open('itemdb')
members = dbm.open('memberdb')
loans = dbm.open('loandb','w')
loan2 = loans['2'].decode() #decode()把dbm字节格式转换成str字符串格式
print('loan2:',loan2)
loan2 = loan2.split(',') #split()将str字符串分离成单独的域,返回一个列表
print('loan2:',loan2)
#通过使用借出记录值作为键,提取对应的成员和物品记录#
item2 = items[loan2[1]].decode().split(',')
print('items:',item2)
member2 = members[loan2[2]].decode().split(',')
print('members:',member2)
print('{} borrowed a {} on {}'.format(
member2[1],item2[1],loan2[3]))
if __name__ == '__main__':
main1()
main2()
2.使用shelve作为持久化字典
#/usr/bin/python3
#coding:utf-8
import shelve
# ID, Name, Description, OwnerID, Price, Condition, DateRegistered
items = [
['1','Lawnmower','Tool','1','$150','Excellent','2012-01-05'],
['2','Lawnmower','Tool','2','$370','Fair','2012-04-01'],
['3','Bike','Vehicle','3','$200','Good','2013-03-22'],
['4','Drill','Tool','4','$100','Good','2013-10-28'],
['5','Scarifier','Tool','5','$200','Average','2013-09-14'],
['6','Sprinkler','Tool','1','$80','Good','2014-01-06']
]
# ID, Name, Email
members = [
['1', 'Fred', 'fred@lendylib.org'],
['2', 'Mike', 'mike@gmail.com'],
['3', 'Joe', 'joe@joesmail.com'],
['4', 'Rob', 'rjb@somcorp.com'],
['5', 'Anne', 'annie@bigbiz.com'],
]
# ID, ItemID, BorrowerID, DateBorrowed, DateReturned
loans = [
['1','1','3','4/1/2012','4/26/2012'],
['2','2','5','9/5/2012','1/5/2013'],
['3','3','4','7/3/2013','7/22/2013'],
['4','4','1','11/19/2013','11/29/2013'],
['5','5','2','12/5/2013','None']
]
def createDB(data, shelfname):
try:
shelf = shelve.open(shelfname,'c')
for datum in data:
key = datum[0]
shelf[key] = datum
finally:
shelf.close()
def readDB(shelfname):
try:
shelf = shelve.open(shelfname,'r')
return [shelf[key] for key in shelf.keys()]
finally:
shelf.close()
def main1():
print('Creating data files...')
createDB(items, 'itemshelf')
createDB(members, 'membershelf')
createDB(loans, 'loanshelf')
print('reading items...')
print(readDB('itemshelf'))
print('reading members...')
print(readDB('membershelf'))
print('reading loans...')
print(readDB('loanshelf'))
def main2():
items = shelve.open('itemshelf','w')
members = shelve.open('membershelf','w')
loans = shelve.open('loanshelf','w')
#与dbn区别:不再需要使用decode()把字节转换成普通字符串,不需要进行split()操作获得一个列表
loan2 = loans['2']
print('loan2:',loan2)
item2 = items[loan2[1]]
print('item2:',item2)
member2 = members[loan2[2]]
print('member2:',member2)
print('{} borrowed a {} on {}'.format(
member2[1],item2[1],loan2[3]))
if __name__ == "__main__":
main1()
main2()