day01先睹为快(中)

根据day01先睹为快(上)的个格式化文本结构,是可以解决人员管理的问题,但是存在以下局限性:

  • 获取一条数据,也需要重新从文件中读取整数据库
  • 每次更新一个数据,也需要从整个文件中读取,然后重新写入文件,当数据量多的时候,局大大制约了程序的效率
  • 写入文件是和加载过程中如果存在分隔符“==>”就会使得程序崩溃

于是引入pickle模块,将内存中的python对象转换成序列化的字节流,可以写入任何类似文件对象的字节串;也可以根据序列化的自救刘重新构成内存中的对象。

1、创建make_db_pickle.py文件,将字典对象转换成序列化的字节流信息保存到文件

1 from initdata import db
2 import pickle
3 
4 dbfile=open("people_pickle","wb")  #创建一个文件对象  以字节流的形式写入文件
5 pickle.dump(db,dbfile)    #将对象转换成序列化的字节流  保存在people_pickle文件当中
6 
7 dbfile.close()

运行make_db_pickle.py文件后在指定的路径下创建一个people_pickle文件,将字典对象转换成字节流存储

2、创建dump_db_pickle.py文件,将字节流信息加载到字典对象

1 import pickle
2 
3 dbfile=open("people_pickle","rb") #打开文件
4 db=pickle.load(dbfile)  #加载字节流 将字节流转换成字典对象
5 
6 for key in db:
7     print(key,"==>",db[key])
8 
9 print(db["yw"]["name"])

3、创建update_db_pickle.py 更新数据

 1 import pickle
 2 
 3 # 从文件中加载数据
 4 dbfile=open("pickle_people","rb")
 5 db=pickle.load(dbfile)
 6 dbfile.close()
 7 
 8 """
 9 对字典进行修改
10 """
11 db["yw"]["name"]="甄子丹"
12 db["yw"]["age"]=56
13 
14 # 将数据重新写入到pickle文件当中
15 dbfile=open("pickle_people","wb")
16 pickle.dump(db,dbfile)
17 dbfile.close()

以上也可以实现相应的功能,但是也存在一个缺陷,处理文件叫大的时候,数据库变的很慢,因为每当更新一条数据就需要读出和写入整个数据库

改进办法  对数据库中每一条记录都写到一个普通文件当中  为每一条记录使用一个pickle文件

1)创建一个make_db_pickle_recs.py  将的每条记录写入到文件当中

1 from initdata import db
2 import pickle
3 
4 for key,value in db.items():  # 获得数据库中字典及其数据
5     refile=open("dbfile/"+key+".pkl","wb")
6     pickle.dump(value,refile)
7     refile.close()

模块介绍   glob模块中的glob("*.pkl")  根据文件的扩展名,获取文件家中指定文件扩展名中的所有文件

2)加载对应的文件  获得字典  创建一个dump_db_pickle_recs.py  

 1 import pickle,glob
 2 
 3 for filename in glob.glob("dbfile/*.pkl"):
 4     recfile=open(filename,"rb")
 5     record=pickle.load(recfile)
 6     print(filename,record)
 7     recfile.close()
 8 
 9 bobfile=open("dbfile/bob.pkl","rb")  #根据的文件  加载相应的字典
10 bob=pickle.load(bobfile)
11 print(bob)
12 bobfile.close()

 

posted @ 2019-08-03 16:53  小小海鸥  阅读(153)  评论(0编辑  收藏  举报