程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(5)

序列化,pickle,shelve,json,configparser

发布于2019-08-08 11:37     阅读(631)     评论(0)     点赞(4)     收藏(1)


1,序列化

序列化:
把对象打散成bytes和字符串,方便存储和传输

反序列化:
把bytes和字符串转化为对象
Python中提供的序列化方法,pickle,shelve,json

2,pickle

  pickle

  能把Python的任何数据类型转换成bytes类型

  pickle方法

  • dump ,将对象序列化成bytes,并写入文件
  • load  ,将bytes类型的反序列化为对象,在文件中操作
  • dumps,将对象序列化成bytes
  • loads  ,将bytes类型的反序列化为对象

只是序列化dumps,loads

复制代码
 1 import pickle
 2 
 3 class Cat:
 4     def __init__(self,name,age):
 5         self.name = name
 6         self.age = age
 7     def catchMouse(self):
 8         print(self.name,self.age,"抓老鼠")
 9 
10 c = Cat("jerry",18)
11 
12 #dumps 把对象转化成bytes, 序列化
13 bs = pickle.dumps(c)
14 
15 #把bytes转换回对象 ,反序列化
16 h = pickle.loads(bs)
复制代码

 

 将序列化的东西写入文件dump,load

复制代码
 1 import pickle
 2 
 3 class Cat:
 4     def __init__(self,name,age):
 5         self.name = name
 6         self.age = age
 7     def catchMouse(self):
 8         print(self.name,self.age,"抓老鼠")
 9 
10 c = Cat("jerry",18)
11 
12 #把对象转成bytes写入文件中
13 f = open("pickle.txt","wb")
14 pickle.dump(c,f)
15 
16 #把文件中的bytes读出来
17 f = open("pickle.txt","rb")
18 c = pickle.load(f)
复制代码

 

 序列化一堆文件时,如果文件量不大,可以一次性写入,一次性读取,方便

复制代码
 1 #实例化一堆猫
 2 lst = [Cat("cat1",10),Cat("cat2",10),Cat("cat3",10),Cat("cat4",10),Cat("cat5",10)]
 3 
 4 #文件量不大的时候,一次存入
 5 f = open("pickle.txt","wb")
 6 pickle.dump(lst,f)
 7 f.flush()
 8 f.close()
 9 #一次读出来
10 f = open("pickle.txt","rb")
11 j = pickle.load(f)
复制代码

 

如果文件量大,可以分多次写入,循环多次读取,并处理异常

复制代码
 1 #文件量大的时候,一次一次写入
 2 f = open("pickle.txt","wb")
 3 for el in lst:
 4     pickle.dump(el,f)
 5 f.flush()
 6 f.close()
 7 #读的时候多次读取
 8 f = open("pickle.txt","rb")
 9 while 1:
10     try:
11         d = pickle.load(f)
12         print(d)
13     except EOFError as e:
14         break
15 f.close()
复制代码

 

 

3,shelve模块

shelve
shelve提供Python的持久化操作,把内存的数据写到硬盘上,操作shelve的时候
非常像一个字典,更redis像
复制代码
 1 import shelve
 2 
 3 #打开一个文件,像操作字典一样去操作文件
 4 f = shelve.open("shelve.txt")
 5 f["jay"] = "周杰伦"
 6 print(f["jay"])
 7 f.close()
 8 
 9 
10 #一个字典的嵌套
11 f = shelve.open("shelve.txt")
12 f["kd"] = {"name":"杜兰特","age":30,"aihao":"喝洗澡水"}
13 print(f["kd"]["aihao"])#喝洗澡水
14 f.close()
15 
16 #更改,需要加上writeback,写回文件
17 f = shelve.open("shelve.txt",writeback=True)
18 f["kd"] = {"name":"杜兰特","age":30,"aihao":"喝洗澡水"}
19 print(f["kd"]["aihao"])#喝洗澡水
20 f["kd"]["aihao"]="逛夜店"
21 print(f["kd"]["aihao"])#逛夜店
22 f.close()
23 
24 #得到所有的key
25 f = shelve.open("shelve.txt")
26 f["1"] = "a"
27 f["2"] = "b"
28 f["3"] = "c"
29 f["4"] = "d"
30 
31 for i in f.keys():
32     print(i)
33 
34 #得到所有的key,value
35 
36 for k,v in f.items():
37     print(k,v)
复制代码

 

4,json模块

前后端数据交互的通用数据格式,只是将数据转换成字符串格式
处理中文要加上ensure_ascii = False

 

json中,使用只有两种情况,将字典,列表转换成字符串,再将字符串转换成字典,列表

复制代码
 1 import json
 2 
 3 #把字典转成字符串
 4 dic = {"a":1,"c":"帅奥立","c":"lixiang"}
 5 s=json.dumps(dic,ensure_ascii=False)#干掉ascii码
 6 print(s,type(s))
 7 print(repr(s),type(s))#repr打印出字符串带引号
 8 
 9 # #把字符串转成字典
10 dic1 = json.loads(s)
11 print(dic1,type(dic1))
复制代码

 

 

将转换之后的字符串写入到文件中,从文件中读取字符串再装换  dump,load

复制代码
#把字典转成字符串写入文件中
s = open("waimai.json","w",encoding="utf-8")
json.dump(dic,s,ensure_ascii=False)
s.close()

文件中读,并将字符串转换
w = open("waimai.json","r",encoding="utf-8")
s = json.load(w)
复制代码

 

把文件读出,json读数据的时候,要一行一行的读
通过dump写的时候,是把多个数据写入同一行
所以,不提倡使用dump,load写和读

复制代码
 1 #写入的时候
 2 #循环
 3 #用dumps把字典转换成字符串,然后在后面加换行符/n
 4 #写入
 5 
 6 #字典
 7 dic = [{"shuai":"aoli"},{"deng":"xiangxinag","haung":"zishi"},{"zhang":"zifneg"}]
 8 #打开文件
 9 f = open("p.json","w",encoding="utf-8")
10 for i in dic:
11     s = json.dumps(i,ensure_ascii=False) + '\n'
12     #json.dump(s,f,ensure_ascii=False)
13     f.write(s)
14 f.close()
15 
16 
17 #读取的时候
18 #for line in f:
19 #strip() 去掉每一行的空白/n
20 #loads()变成字典
21 
22 f = open("p.json","r",encoding="utf-8")
23 for line in f:
24     line = line.strip()
25     s=json.loads(line)
26     print(s)
27 f.close()
复制代码

 

5,configparser

configparser
处理配置文件,把配置文件作为一个大的字典来处理,能进行创建,增删改查

创建一个配置文件
复制代码
 1 import configparser
 2 
 3 
 4 #写配置到文件
 5 conf = configparser.ConfigParser()
 6 conf["DEFAULT"] = {
 7     "session-time-out":30,
 8     "user-alive":60,
 9     "connect-alive":10
10 }
11 
12 conf["189-DB"] = {
13     "ip":"192.168.2.189",
14     "port":3306,
15     "uname":"root",
16     "password":"root"
17 }
18 conf["186-DB"] = {
19     "ip":"192.168.2.186",
20     "port":3306,
21     "uname":"root",
22     "password":"root"
23 }
24 f = open("db.ini",mode="w")
25 conf.write(f)
26 
27 
28 
29 
30 运行结果
31 db.ini
32 
33 
34 [DEFAULT]
35 session-time-out = 30
36 user-alive = 60
37 connect-alive = 10
38 
39 [189-DB]
40 ip = 192.168.2.189
41 port = 3306
42 uname = shuai
43 password = root
44 
45 [186-DB]
46 ip = 192.168.2.186
47 port = 3306
48 uname = root
49 password = root
复制代码

 

 

前面说。它像一个字典一样,就能用字典类似的方式来操作

复制代码
 1 #读取内容
 2 conf= configparser.ConfigParser()
 3 conf.read("db.ini")
 4 #读取章节
 5 print(conf.sections())
 6 #章节可以向字典一样操作
 7 print(conf["189-DB"]["ip"])
 8 
 9 #遍历章节
10 for key in conf["189-DB"]:
11     print(key)
12 
13 for k,v in conf["189-DB"].items():
14     print(k,v)
复制代码

 

增删改都需要将文件从写,最开始读文件(conf.read())的时候,是将全部读到内存中去

复制代码
1 #增删改,改完之后在写回文件
2 conf= configparser.ConfigParser()
3 conf.read("db.ini")#在这里,是把db,ini文件全读到内存中去了
4 conf["189-DB"]["uname"] = "shuai" #
5 #del conf["189-DB"]["password"]#删除
6 conf.set("189-DB","max-connect","1024")#189-DB章节中增加一个max-connect属性值为1024
7 conf.add_section("130-DB")#增加一个章节
8 conf.write(open("db.ini","w",))#增删改完成后,要重写文件
复制代码

 

 

 




 



所属网站分类: 技术文章 > 博客

作者:小兔子乖乖

链接:https://www.pythonheidong.com/blog/article/13852/01b93389f3e21dcd9889/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

4 0
收藏该文
已收藏

评论内容:(最多支持255个字符)