Python对象的永久存储
1.使用Python的pickle模块
import pickle
class A:
def __init__(self,name,a):
self.name=name
self.a=a
def rewrite(self,args):
self.a=args #将对象使用pickle模块转换成二进制文件然后写入文件中
#但此种方法无法直接更新对象文件的信息
#此时存入文件的应该是对象本身而不是内存地址
obj1=A("qw","")
obj1=pickle.dumps(obj1)
with open("userinfo","ab")as f:
f.write(obj1)
obj2=A("qa","")
obj2=pickle.dumps(obj2)
with open("userinfo","ab")as f:
f.write(obj2)
obj3=A("qs","")
obj3=pickle.dumps(obj3)
with open("userinfo","ab")as f:
f.write(obj3) #读取文件中的对象文件
#pickle.load()一次只读取一个对象文件
f=open("userinfo","rb")
while :
try:
obj = pickle.load(f)
print(obj.a,obj)
except:
break
f.close()
f=open("userinfo","rb")
while :
try:
obj = pickle.load(f)
print(obj.a,obj)
except:
break
f.close()
结果
#分别两次打开文件读取,对象内存地址会发生改变
<__main__.A object at 0x10c1375c0>
<__main__.A object at 0x10c137518>
<__main__.A object at 0x10c137940>
<__main__.A object at 0x10c1379b0>
<__main__.A object at 0x10c137630>
<__main__.A object at 0x10c1375c0> 可以将对象放进列表中再写入文件
如需修改对象时,将列表中的对象修改后再放回列表中最后再重新写入文件中 2.使用Python的shelve库。其和Python内置的数据结构“字典”操作很类似,
不同点是shelve存储在外部文件中而不是存储在计算机内存中。
import shelve
class A:
def __init__(self,name,a):
self.name=name
self.a=a
def rewrite(self,args):
self.a=args
obj1=A("qw","")
obj2=A("qa","")
obj3=A("qs","")
#写入文件
db=shelve.open("userinfo1")
db["qw"]=obj1
db["qa"]=obj2
db["qs"]=obj3
db.close()
#更新信息
db=shelve.open("userinfo1")
for k in db:
print(db[k].a)
a=db[k]
a.a=
db[k]=a
db.close()
db=shelve.open("userinfo1")
for k in db:
print(db[k].a)
db.close()