python 对象持久化

testdemo.py
class AttrDisplay():
    def gatherAtters(self):
        attrs=[]
        for key in sorted(self.__dict__):
            attrs.append('%s=%s'%(key, getattr(self, key)))
        return ', '.join(attrs)
    
    def __str__(self):
        return '[%s: %s]'%(self.__class__.__name__, self.gatherAtters())
    
    
class Person(AttrDisplay):
    def __init__(self, name, job=None, pay=0):
        self.name=name
        self.job=job
        self.pay=pay
    
    def lastName(self):
        return self.name.split()[-1]
    
    def giveRaist(self, percent):
        self.pay=int(self.pay*(1+percent))
        
class Manager(Person):
    def __init__(self, name, pay=0):
        Person.__init__(self, name, 'mgr', pay)
        
    def giveRaist(self, percent):
        Person.giveRaist(self, percent+1)
    
#对象持久化
#pickel:任意的python对象和字符串之间的序列化
#dbm:实现一个可通过键访问的文件系统,以存储字符串
#shelve:使用另两个模块按照键把python对象存储到一个文件中
bob=Person('bob smith')
sue=Person('sue jones', 'dev', 10000)
tom=Manager('tom jones',50000)

import shelve
db=shelve.open('persondb')
for object in (bob,sue,tom):
    db[object.name]=object
db.close()
#此时当前目录下会有多个文件,都以"persondb"开头,这些文件实现为一个通过键访问的文件,其中包含了3个python对象的pickle化的表示,他们是数据库,是备份和移动存储的时候需要赋值和转移的内容
#这些文件使用windows explorer和python shell都可以看到,但是都是二进制的散列文件

import glob
print(glob.glob('person*'))    #返回当前路径匹配结果['persondb.bak', 'persondb.dat', 'persondb.dir']
print(open('persondb.dir').read())

print(open('persondb.dat','rb').read())

**************************************************************************************************************

testdemo2.py

#读取数据库
#载入一个实例的时候,类极其模块的文件都必须导入
#该类的实例再次载入的时候,对类的源代码文件的修改会自动选取
import testdemo
import shelve
db=shelve.open('persondb')
print(len(db))    #获取数据条数 3
print(list(db.keys()))   #获取数据键值 ['bob smith', 'sue jones', 'tom jones']
tom=db['tom jones']
print(tom)    #[Manager: job=mgr, name=tom jones, pay=50000]
print(tom.lastName())    #jones
print(tom.pay)     #50000
for key in db.keys():
    print(key, '=>', db[key])   #打印数据库中所有数据
for key in sorted(db, reverse=True):
    print(key, '=>', db[key])   #打印数据库中所有数据,并且排序
db.close()

**************************************************************************************************************

testdemo3.py

#更新shelve中的对象
import shelve
db=shelve.open('persondb')
sue=db['sue jones']
print(sue)    #[Person: job=dev, name=sue jones, pay=10000],每次执行值都会存储
sue.giveRaist(1.1)
db['sue jones']=sue
print(sue)    #[Person: job=dev, name=sue jones, pay=21000]   pay为最新的值,每次执行值都会变化
db.close()


展开阅读全文

没有更多推荐了,返回首页