主要内容
- 1. 什么是序列化
- 2. pickle(重点)
- 3. shelve
- 4. json(重点)
- 5. configparser模块
1.序列化的概念
序列化:在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个过程叫序列化
不同的序列化, 结果也不同,但目的是一样的. 都是为了存储和传输.
在python中存在三种序列化的方案.
- pickle: 可以将我们python中的任意数据类型转化成bytes并写入到文件中,同样也可以把文件中写好的bytes转换回我们python的数据,这个过程被称为反序列化
- shelve: 另类的一种序列化的方案. 有点儿类似后面我们学到的redis,可以作为 一种小型的数据库来使用
- json: 将python中常见的字典, 列表转化成字符串,是目前后端数据交互使用频率最高的一种数据格式
2. pickle(重点)
pickle 就是把我们的python对象写入到文件中的一种解决方案. 但是写入到文件的是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("jerry",18) bs = pickle.dumps(c) #序列化一个对象 print(bs) #一堆二进制,看不懂 cc = pickle.loads(bs) # 把二进制的反序列转化成我们的对象 cc.catchMouse() # 猫的功能可以执行
在pickle中的dumps可以序列化一个对象,loads可以反序列化一个对象
# c = Cat("jerry",18) # f = open ("pickle1",mode="wb") # pickle.dump(c,f) #结果人是无法查看的 # f.close() f = open("pickle1",mode = "rb") c = pickle.load(f) print(c) #此时c是一个可执行对象 c.catchMouse()
# lst = [Cat("猫1", 10), Cat("猫2", 9), Cat("猫3", 8), Cat("猫4", 7), Cat("猫5", 6)] # f = open("pickle1",mode = "wb") # for el in lst: # pickle.dump(el, f) # f.flush() # f.close() f = open("pickle1",mode= "rb") while 1: try: c = pickle.load(f) c.catchMouse() except EOFError: break
在pickle中我们使用 dump 进行序列化,将对象转化成bytes并写入文件, load是反序列化,把文件中的bytes进行读取,转化成对象
但是这样写并不够好,因为读的时候,并不能知道有多少对象要读.这里记住, 不能一行一行的读. 那真的要写入或者读取多个内容怎么办? 很简单. 装list里. 然后读取和写入都用list
# lst = [Cat("猫1", 10), Cat("猫2", 9), Cat("猫3", 8), Cat("猫4", 7), Cat("猫5", 6)] # f = open("pickle1",mode = "wb") # pickle.dump(lst, f) # f.flush() # f.close() f = open("pickle1",mode= "rb") while 1: try: lst = pickle.load(f) for el in lst : el.catchMouse() except EOFError: break
3. shelve
shelve提供python的持久化操作. 持久化操作:就是把数据写到硬盘上,在操作shelve的时候非常的像操作一个字典,这个东西到后期,就像redis差不多
import shelve f = shelve.open("sylar") #打开一个文件 f['Ljj'] = "林俊杰" f['Jay'] = "周杰伦" f['zzr'] = "周芷若" #像操作字典一样操作文件 print(f['Jay']) print(f["Ljj"]) f.close()
# f = shelve.open("sylar") # f["Jay"] = {"name":"周杰伦","age":"19","hobby":"唱歌"} # print(f["Jay"]) # f.close() # f = shelve.open("sylar") # f["Jay"]["name"] = "肉夹馍" # f.close() # # f = shelve.open("sylar") # print(f["Jay"]) # f.close() #{'name': '周杰伦', 'age': '19', 'hobby': '唱歌'} 发现此时想要改变的值并未发生改变 #解决方案 f = shelve.open("sylar",writeback= True) f["Jay"]["name"] = "肉夹馍" f.close() f = shelve.open("sylar") print(f["Jay"]) f.close() #{'name': '肉夹馍', 'age': '19', 'hobby': '唱歌'}此时值发生改变
*** writeback=True可以动态的把我们修改的信息写入到文件中. 而且还可以删除数据,就像字典一样
# f = shelve.open("sylar",writeback=True) # del f["Jay"] # f.close() # # f = shelve.open("sylar") # print(f["Jay"]) #报错,.没有了 # f.close() # f = shelve.open("sylar", writeback=True) # f['jay'] = "周杰伦" # f['wlj'] = "王力宏" # f.close() # f = shelve.open("sylar") # for k,v in f.items(): # print(k,v)
4. json(重点)
json是我们前后端交互的枢纽(前后端通用的书库格式),相当于编程界的普通话
json的语法格式可以完美的表示一个对象, json全 称javascript object notation. 翻译过来叫js对象简谱.
wf = { "name": "汪峰", "age": 18, "hobby": "抢头条", "wife": { "name": "子怡", "age": 19, "hobby":["唱歌", "跳舞", "演戏"] } }
在python里这玩意叫字典. 但是在javascript里这东西叫json
我们的程序是在python里写的,但是前端是在JS那边来解析json的,
所以,我们需要把我们程序产生的字典 转化成 json格式的json串(字符串),然后通过网络传输,那边接收到了之后,再进行传输.
(1)需要将字典转化成json格式的字符串.
import json dic = {"a":"少林足球","b":"大话西游","c":"功夫","d":"九品芝麻官"} # s = json.dumps(dic) # 把字典转化成json字符串 # print(s) # {"a": "\u5c11\u6797\u8db3\u7403", "b": "\u5927\u8bdd\u897f\u6e38", "c": "\u529f\u592b", "d": "\u4e5d\u54c1\u829d\u9ebb\u5b98"} # 如果你的key或者value超出了ascii范畴。 就会显示成\uxxxxx s = json.dumps(dic,ensure_ascii=False) # 干掉ascii码 print(s,type(s)) #{"a": "少林足球", "b": "大话西游", "c": "功夫", "d": "九品芝麻官"},<class 'str'>
(2)将前端传递过来的json字符串转化成字典
import json # dic = {"a":"少林足球","b":"大话西游","c":"功夫","d":"九品芝麻官"} s = json.dumps(dic,ensure_ascii=False) # 干掉ascii码 dic1 = json.loads(s) print(dic1,type(dic1)) #'a': '少林足球', 'b': '大话西游', 'c': '功夫', 'd': '九品芝麻官'} <class 'dict'>
(3)json也可以像pickle一样把序列化的结果写入到文件中
import json # 写入 # dic = {"a":"少林足球","b":"大话西游","c":"功夫","d":"九品芝麻官"} # f = open("json1",mode ="w",encoding ="utf-8") # json.dump(dic,f,ensure_ascii=False) # 把json写入到文件中 # f.close() #读出 f = open("json1",mode = "r",encoding = "utf-8") s = json.load(f) #把文件中的json串读成字典 print(s,type(s)) #{'a': '少林足球', 'b': '大话西游', 'c': '功夫', 'd': '九品芝麻官'} <class 'dict'> f.close()
另外:当向同一个文件写入json串时
import json # lst = [{"a": 1}, {"b": 2}, {"c": 3}] # #写入 # f = open("json2",mode = "w",encoding = "UTF-8") # for el in lst: # s = json.dumps(el,ensure_ascii=True) +"\n" #此处如果 写成json.dump(el, f, ensure_ascii=False)就写成了一行,读取时并不能够读出来 # f.write(s) # f.close() #读取 f = open("json2",mode= "r",encoding ="utf-8") for line in f : dic = json.loads(line.strip()) print(dic) f.close()
写入
- 循环
- 用dumps把字典转化成字符串, 然后手工在后面加一个\n
- 写入 f.write()
读取
- for line in f:
- strip()去掉空白
- loads()变成字典
5. configparser模块
该模块适用于配置文件的格式与windows ini文件类,可以包含一个或多个节(section)每个节可以有多个参数(键=值)
[DEFAULT] session-time-out = 30 user-alive = 60 connect-alive = 10 [189-DB] ip = 189.135.63.12 port = 3306 uname = root password = root [166-DB] ip = 189.135.63.12 port = 3306 uname = root password = root [163-DB] ip = 189.135.63.12 port = 3306 uname = alex password = root wangermazi = 189 [jay]
import configparser # conf = configparser.ConfigParser() # conf["DEFAULT"] = { # "session-time-out":30, # "user-alive": 60, # "connect-alive":10 # } # conf["189-DB"] = { # "ip": "189.135.63.12", # "port": 3306, # "uname": "root", # "password": "root" # } # conf["166-DB"] = { # "ip": "189.135.63.12", # "port": 3306, # "uname": "root", # "password": "root" # } # conf["163-DB"] = { # "ip": "189.135.63.12", # "port": 3306, # "uname": "root", # "password": "root" # } # # f = open("db.ini", mode="w") # conf.write(f) # 把文件扔进去。 写到这个文件里 #读取 # conf = configparser.ConfigParser() # conf.read("db.ini") #读取文件 # print(conf.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息 # print(conf.get("DEFAULT","SESSION-TIME-OUT")) #从xxx章节中读取到xxx信息 # # #可以像字典一样操作 # print(conf['166-DB']["ip"]) # print(conf["166-DB"]["port"]) # print(conf["166-DB"]["uname"]) # print(conf["166-DB"]["password"]) # # for k,v in conf["166-DB"].items(): # print(k,v) #增删改操作 conf = configparser.ConfigParser() conf.read("db.ini") #读取出来 conf['163-DB']['uname'] = "alex" # del conf['163-DB']["password"] conf.set("163-DB", "wangermazi", "189") conf.add_section("jay") conf.write(open("db.ini", mode="w"))