主要内容:
- 什么是序列化
- pickle
- shelve
- json
- configparser(模块)
一 序列化
我们在存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和
传输的数据格式,这个就叫序列化 python中序列化有三种方案:
1 pickle
2 sheelve
3 json :
二 pickle ( 可以将我们python中的任意数据类型转化成bytes并写入到⽂文件中. 同样也 可以把⽂文件中写好的bytes转换回我们python的数据. 这个过程被称为反序列列化 )
这需要记住这四个东西:
dumps 序列化。 把对象转化成bytes
loads 反序列化。 把bytes转化成对
dump 序列化。 把对象转化成bytes并写入文件
load 反序列化。把文件中的bytes读取。转化成对象
序列化 :
import pickle class Cat: def __init__(self,name,age): self.name=name self.age=age def catchMouse(self): print(self.name,self.age,"吃饭") c=Cat("阿萨德",'10') # c.catchMouse() # # dumps 把对象转化成bytes 序列化 ab=pickle.dumps(c) # 序列化一个对象 print(ab) # 看不懂的二进制 # 把bytes 转换回对象 反序列化 a=pickle.loads(ab) #把二进制反序列列化成我们的对 a.catchMouse() # 猫依然是猫. 依然可以吃饭 阿萨德 10 吃饭
怎么写入文件:
dump 序列化。 把对象转化成bytes并写入文件 # load 反序列化。把文件中的bytes读取。转化成对象
还用的上边那个对象
# c=Cat("阿萨德",'10') # f = open("pickle-text", mode="wb") # 写入文件 # pickle.dump(c,f) # 看不懂的 # f = open("pickle-text", mode="rb") # 读取 文件 # a=pickle.load(f) #反序列化 # a.catchMouse() # 看得懂的 支持多个对象写出: lst = [Cat("猫1", 10), Cat("猫2", 9), Cat("猫3", 9), Cat("猫4", 9), Cat("猫5",9)] # f = open("pickle-text", mode="wb") # # a= pickle.dump(lst,f) # 这么写文件里乱 # for el in lst: # pickle.dump(el, f) # 这么写清楚 # f.flush() # f.close() f = open("pickle-text", mode="rb") while 1: try: c = pickle.load(f) c.catchMouse() # 结果为 猫1", 10 吃饭 至猫5
except EOFError: break
但是这样写并不够好. 因为读的时候. 并不能知道有多少对象要读. 这⾥里里记住, 不能⼀一⾏行行行行的读. 那真的要写入或者读取多个内容怎么办? 很简单. 装list⾥里里. 然后读取和写入都⽤用 list
# lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] # # # f=open("pickle-text",mode="wb") # # pickle.dump(lst,f) # # f=open("pickle-text",mode="rb") # l1=pickle.load(f) # for el in l1: # el.catchMouse() # 结果 为 jerry 19 吃饭
tommy 20 吃饭
alpha 21 吃饭
三 shelve (简单另类的一种序列化的方案. 有点儿类似后面我们学到的redis. 可以作为 一种小型的数据库来使⽤) 就是把数据写到硬盘上,在操作shelve的时候就像操作一个字典.
import shelve shelf=shelve.open("asd") shelf["jad"]="Lisa" print(shelf['jad']) shelf.close() s = shelve.open("asd") s["jay"] = {"name":"周杰伦", "age":18, "hobby":"哄小孩"} print(s['jay']) s.close() s = shelve.open("asd", writeback=True) # 这个鬼东西可以帮我们动态改变信息并写到文件中 # 这个鬼东西换可以帮我们删除数据 就像字典一样 s['jay']['name'] = "胡辣汤" # 尝试改变字典中的数据 s.close() s = shelve.open("asd") print(s['jay']) # 改变了 s.close() s = shelve.open("asd") # for k in s: # 像字典一样遍历 # print(k) # print(s.keys()) # 拿到所有key的集合 for k in s.keys(): print(k) for k, v in s.items(): # 像字典⼀样操作 print(k, v) s.close()
综上shelve就当成字典来用就⾏
四 json( 将python中常见的字典, 列表转化成字符串. 是目前后端数据交互使用频率 最高的一种数据格式.)全称 javascript object notatio
# dic={"a":'女王','b':';萝莉','c':'小清新'} # s=json.dumps(dic,ensure_ascii=False) # 把 字典转化成json字符串 # print(s,type(s)) # ensure_ascii=False 这个鬼东西可以处理中文 # # s = '{"a": "女王", "b": "萝莉", "c": "小清新"}' # dic=json.loads(s) # 把前端传递过来的json字符串转化成字典 # print(dic,type(dic)) # json也可以像pickle一样吧序列化的结果写到文件中 # dic = {"a": "女王", "b": "萝莉", "c": "小清新"} # f=open('text.json',mode='w',encoding="utf-8") # 把对象打散成json写到文件中 # json.dump(dic,f,ensure_ascii=False) # f.close() #读取 文件中的json # f=open('text.json',mode='r',encoding="utf-8") # dic=json.load(f) # 读取json里的对象 # f.close() # print(dic)
我们可以向同⼀个文件中写入多个json串
写入的时候 # 1. 循环 # 2. 用dumps把字典转化成字符串, 然后手工在后面加一个 # 3. 写出 # f = open("new_menu.json", mode="w", encoding="utf-8") # lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}] # for el in lst: # s = json.dumps(el, ensure_ascii=False) + " " # f.write(s) # # f.flush() # f.close() # 读取的时候 # 1. for line in f: # 2. strip()去掉空白 # 3. loads()变成字典 # f = open("new_menu.json", mode="r", encoding="utf-8") # for line in f: # line = line.strip() # dic = json.loads(line) # print(dic)
五 configparser
ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini
配置文件相似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。使用的配置文件的好处就是不用再程序中硬编码,可以是你的程序变得灵活起来。
注意:在python 3 中ConfigParser
模块名已更名为configparser
函数
读取配置文件:
- read(filename) 直接读取ini文件内容
- sections() 得到所有的section,并以列表的形式返回
- options(section) 得到该section的所有option
- items(section) 得到该section的所有键值对
- get(section,option) 得到section中option的值,返回为string类型
- getint(section,option) 得到section中option的值,返回为int类型
- getfloat(section,option)得到section中option的值,返回为float类型
- getboolean(section, option)得到section中option的值,返回为boolean类型
写入配置文件
- add_section(section) 添加一个新的section
- has_section(section) 判断是否有section
- set( section, option, value) 对section中的option进行设置
- remove_setion(section)删除一个section
- remove_option(section, option)删除section中的option
- write(fileobject)将内容写入配置文件。