python--(常用模块-2序列化)
一.序列化:
把对象打散成bytes或者字符串。 方便存储和传输 序列化
把bytes或者字符串转换回对象。 反序列化
# dumps 序列化。 把对象转化成bytes
# loads 反序列化。 把bytes转化成对象
# dump 序列化。 把对象转化成bytes并写入文件
# load 反序列化。把文件中的bytes读取。转化成对象
二.pickle(比较重要)
把python中所有的对象都可以转化成bytes。进行存储和传输
1 # import pickle 2 # class Cat: 3 # def __init__(self,name,age): 4 # self.name = name 5 # self.age = age 6 # 7 # def catchMouse(self): 8 # print(self.name,"抓老鼠") 9 # c = Cat("jerry",18) 10 # bs = pickle.dumps(c) #序列化一个对象 11 # print(bs)#一堆二进制,看不懂 12 # 13 # cc = pickle.loads(bs) #把二进制反序列化成我们的对象 14 # cc.catchMouse() 15 16 17 18 # lst = [Cat("jerry",Cat("tommy",20),Cat("alpha",21))] 19 # 20 # f = open("cat",mode = "wb") 21 # pickle.dump(lst,f) #写入到文件中 22 # 23 # f = open("cat",mode = "rb") 24 # l1 = pickle.load(f) #从文件中读取 25 # for i in l1: 26 # i.catchMouse()
三.shelve
shelve提供python的持久化操作. 什么叫持久化操作呢? 说⽩话,就是把数据写到硬盘上.
在操作shelve的时候非常的像操作⼀个字典. 这个东⻄到后期. 就像redis差不多.
1 import shelve 2 3 # 打开一个文件 4 # f = shelve.open("大阳哥", writeback=True) 5 # f['jj'] = "林俊杰" 6 # f['dyg'] = "大阳哥" 7 # f['zzr'] = "周芷若" 8 9 # f = {} 10 # 像操作字典一样操作文件 11 # f["jay"] = "周杰伦" 12 # print(f['jay']) 13 14 # f["jay"] = {'name': "周杰伦", 'age': 38, "hobby": "吃喝拉撒睡"} 15 16 # f['jay']['name'] = "胡辣汤" 17 # print(f['jay']['name']) 18 # print(f['jay']) 19 20 21 # f.close() 22 23 f = shelve.open("大阳哥") 24 # print(f.keys()) 25 # for k in f.keys(): # 可以获取到所有的key 26 # print(k) 27 # 28 # for k in f: 29 # print(k) 30 # 31 # for k, v in f.items(): 32 # print(k, v)
四.json(重点)
json是我们前后端交互的枢纽. 相当于编程界的普通话. ⼤家沟通都⽤
json. 为什么这样呢? 因为json的语法格式可以完美的表⽰出⼀个对象. 那什么是json: json全
称javascript object notation. 翻译过来叫js对象简谱.
1 # import json 2 # dic = {"a":"女王","b":"萝莉","c":"小仙女"} 3 # s = json.dumps(dic) #把字典转换成json字符串 4 # print(s) 5 # #{"a": "u5973u738b", "b": "u841du8389", "c": "u5c0fu4ed9u5973"} 6 # 7 # import json 8 # dic = {"a":"女王","b":"萝莉","c":"小仙女"} 9 # s = json.dumps(dic,ensure_ascii=False) #ensure_ascii=False 去asxiii码 10 # print(type(s),s) 11 # #<class 'str'> {"a": "女王", "b": "萝莉", "c": "小仙女"} 12 # 13 # import json 14 # s = '{"a": "⼥王", "b": "萝莉", "c": "小仙女"}' 15 # dic = json.loads(s) 16 # print(type(dic),dic) 17 # #<class 'dict'> {'a': '⼥王', 'b': '萝莉', 'c': '小仙女'} 18 19 20 # #写入文件 21 # dic = {"a": "⼥王", "b": "萝莉", "c": "⼩清新"} 22 # f = open("test.json", mode="w", encoding="utf-8") 23 # json.dump(dic, f, ensure_ascii=False) # 把对象打散成json写⼊到⽂件中 24 # f.close() 25 # 26 # #读取文件 27 # f = open("test.json", mode="r", encoding="utf-8") 28 # dic = json.load(f) 29 # f.close() 30 # print(dic) 31 32 33 # 注意我们可以向同一个文件写入多个json串,但是读不行. 34 # 写入的时候 35 # 1. 循环 36 # 2. 用dumps把字典转化成字符串, 然后手工在后面加一个 37 # 3. 写出 38 # f = open("new_menu.json", mode="w", encoding="utf-8") 39 # lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}] 40 # for el in lst: 41 # s = json.dumps(el, ensure_ascii=False) + " " 42 # f.write(s) 43 # 44 # f.flush() 45 # f.close() 46 47 48 # 读取的时候 49 # 1. for line in f: 50 # 2. strip()去掉空白 51 # 3. loads()变成字典 52 53 # f = open("new_menu.json", mode="r", encoding="utf-8") 54 # for line in f: 55 # line = line.strip() 56 # dic = json.loads(line) 57 # print(dic)
六.configparser
该模块适用于配置⽂件的格式与windows ini⽂件类似,可以包含一个或多个节(section)每个节
可以有多个参数(键=值). 首先, 我们先看一个xxx服务器的配置文件
1 [DEFAULT] [DEFAULT] 2 ServerAliveInterval = 45 3 Compression = yes 4 CompressionLevel = 9 5 ForwardX11 = yes 6 [[bitbucket.org bitbucket.org]] 7 User = hg 8 [[topsecret.server.com topsecret.server.com]] 9 Port = 50022 10 ForwardX11 = no
我们用configparser就可以对这样的文件进行处理.首先,是初始化
1 import configparser 2 config = configparser.ConfigParser() 3 config['DEFAULT'] ={ "sleep": 1000, 4 "session-time-out": 30, 5 "user-alive": 999999 6 } 7 config['TEST-DB'] = { 8 "db_ip": "192.168.17.189", 9 "port": "3306", 10 "u_name": "root", 11 "u_pwd": "123456" 12 } 13 config['168-DB'] = { 14 "db_ip": "152.163.18.168", 15 "port": "3306", 16 "u_name": "root", 17 "u_pwd": "123456" 18 } 19 config['173-DB'] = { 20 "db_ip": "152.163.18.173", 21 "port": "3306", 22 "u_name": "root", 23 "u_pwd": "123456" 24 } 25 f = open("db.ini", mode="w" 26 config.write(f) # 写⼊⽂ 27 f.flush() 28 f.close()
读取文件信息
1 config = configparser.ConfigParser() 2 config.read("db.ini") # 读取⽂ 3 print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信 4 print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 从xxx章节中读取到xxx信 5 # 也可以像字典⼀样操作 6 print(config["TEST-DB"]['DB_IP']) 7 print(config["173-DB"]["db_ip"]) 8 9 for k in config['168-DB']: 10 print(k) 11 for k, v in config["168-DB"].items(): 12 print(k, v) 13 14 print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有 15 print(config.items('168-DB')) #找到'168-DB'下所有 16 17 print(config.get('168-DB','db_ip')) # 152.163.18.168 get⽅法Section下的 18 key对应的value
增删改操作:
1 # 先读取. 然后修改. 最后写回⽂件 2 config = configparser.ConfigParser() 3 config.read("db.ini") # 读取⽂ 4 # 添加⼀个章节 5 # config.add_section("189-DB") 6 # config["189-DB"] = { 7 # "db_ip": "167.76.22.189", 8 # "port": "3306", 9 # "u_name": "root", 10 # "u_pwd": "123456" 11 # } 12 13 # 修改信息 14 config.set("168-DB", "db_ip", "10.10.10.168") 15 # 删除章节 16 config.remove_section("173-DB") 17 # 删除元素信息 18 config.remove_option("168-DB", "u_name") 19 # 写回⽂件 20 config.write(open("db.ini", mode="w"