一.序列化
指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化,
不同的序列化结果不同,但目的是一样的,都是为了存储和传输.
一,pickle.可以将我们python中的任意数据类型转化成bytes并写入到文件中.
同样也可以把文件中写好的bytes转换回我们的python的数据.这个过程被称为序列化
import pickle class Cat: def __init__(self, name, age): self.name = name self.age = age def catchMouse(self): print(self.name, "抓⽼⿏") c = Cat("jerry", 18) bs = pickle.dumps(c) # 序列化一个对象. print(bs) # 一堆二进制. 看不懂 cc = pickle.loads(bs) # 把二进制反序列化成我们的对象 cc.catchMouse() # 猫依然是猫. 还可以抓老鼠
pickle中的dumps可以序列化一个对象. loads可以反序列化一个对象. 我们使用dump 还可以直接 把一个对象写入到文件中 # f = open("cat", mode="wb") # pickle.dump(c, f) # 写到⽂件中 # f.close() f = open("cat", mode="rb") cc = pickle.load(f) # 从文件中读取对象 cc.catchMouse()
pickle还⽀持多个对象的写出.
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] f = open("cat", mode="wb") for el in lst: pickle.dump(el, f) # 写⼊到⽂件中 f.close() f = open("cat", mode="rb") for i in range(len(lst)): cc = pickle.load(f) # 从⽂件中读取对象 cc.catchMouse()
lst = [c1, c2, c3] f = open("cat.dat", mode="ab") pickle.dump(lst, f) # 把对象写到文件中 f = open("cat.dat", mode="rb") lst = pickle.load(f) # 读取第一次 for cc in lst: cc.chi()
用户注册与登录 class User: def __init__(self, username, password): self.username = username self.password = password class client: def regist(self): uname = input("please input your username:") pwd = input("please input your password:") user = User(uname, pwd) pickle.dump(user, open("userinfo", mode="ab")) print("regist successful!!!") def login(self): uname = input("please input your username:") pwd = input("please input your password:") f = open("userinfo", mode="rb") while 1: try: u = pickle.load(f) # 从文件里把对象拿出来 if u.username == uname and u.password == pwd: print("login successful !!") break except Exception as e: print("login failed !!!") break c = client() # c.regist() # c.regist() # c.regist() # c.regist() c.login()
三.shelve
shelve. 简单另类的一种序列化的方案. 有点⼉类似redis. 可以作为 一种小型的数据库来使用
shelve提供python的持久化操作就是把数据写到硬盘上. 在操作shelve的时候非常的像操作一个字典
import shelve shelf = shelve.open("sylar") # shelf["jay"] = "周杰伦" print(shelf['jay']) shelf.close()
我们存储 ⼀些复杂的数据
我们存储一些复杂的数据 s = shelve.open("sylar") # s["jay"] = {"name":"周杰伦", "age":18, "hobby":"哄⼩孩"} print(s['jay']) s.close() 修改时注意需添加参数writeback=True s = shelve.open("sylar", writeback=True) s['jay']['name'] = "胡辣汤" # 尝试改变字典中的数据 s.close() s = shelve.open("sylar") print(s['jay']) # 改变了. s.close() writeback=True可以动态的把我们修改的信息写入到文件中还可以删 除数据. 就像字典⼀样. s = shelve.open("sylar", writeback=True) del s['jay'] s.close() s = shelve.open("sylar") print(s['jay']) # 报错了, 没有了 s.close() s = shelve.open("sylar", writeback=True) s['jay'] = "周杰伦" s['wlj'] = "王力宏" s.close() s = shelve.open("sylar") 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()
四. json(重点)
概念 json. 将python中常用的字典, 列表转化成字符串. 是目前前后端数据交互使用频率 最高的一种数据格式.
json是我们前后端交互的枢纽. 相当于编程界的普通话. 大家沟通都用 json.因为json的语法格式可以完美的表示出一个对象.
json全 称javascript object notation. 翻译过来叫js对象
wf = { "name":"汪峰", "age":18, "hobby":"上头条", "wife":{ "name":'⼦怡', "age":19, "hobby":["唱歌", "跳舞", "演戏"] }
用xml写
<?xml version="1.0" encoding="utf-8" ?> <wf> <name>汪峰</name> <age>18</age> <hobby>上头条</hobby> <wife> <name>子怡</name> <age>18</age> <hobbies> <hobby>唱歌</hobby> <hobby>跳舞</hobby> <hobby>演戏</hobby> </hobbies> </wife> </wf>
json案例
import json 例一 # 准备一个字典 dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None} # python中可以直接把字典或者列表转化成json s = json.dumps(dic, ensure_ascii=False) # pickle print(type(s)) print(s) 例二 s = '{"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": false, "e": null}' d = json.loads(s) # 把json转化成字典 print(d) print(type(d)) 例三 dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None, "wf":{"name":"半壁江山", "hobby":"皮裤"}} f = open("sylar.json", mode="w", encoding="utf-8") json.dump(dic, f, ensure_ascii=False, indent=4) # 4个空格 = 1个tab f = open("sylar.json", mode="r", encoding="utf-8") d = json.load(f) print(d) 例四 class Person: def __init__(self, firstName, lastName): self.firstName = firstName self.lastName = lastName s = '{"firstName": "尼古拉斯", "lastName": "刘能"}' def func(dic): return Person(dic['firstName'], dic["lastName"]) p = json.loads(s, object_hook=func) # 通过函数func把字典转换回对象 print(p.firstName, p.lastName) p = Person("尼古拉斯", "刘能") 例五 #把对象转换成json s = json.dumps(p.__dict__, ensure_ascii=False) # 方案一, 转的是字典 def func(obj): return { "firstName": obj.firstName, "lastName": obj.lastName } s = json.dumps(p, default=func, ensure_ascii=False) # 方案二 转化的也是字典 print(s) 例六 dic1 = {"name":'毒液', "评分": "0.9"} dic2 = {"name":'与神同行', "评分": "10"} dic3 = {"name":'看不见的客人', "评分": "9.5"} lst = [dic1, dic2, dic3] f = open("movie.json", mode="w", encoding="utf-8") for d in lst: s = json.dumps(d, ensure_ascii=False) f.write(s+" ") f = open("movie.json", mode="r", encoding="utf-8") dic1 = json.load(f) # 当json文件中保存多个json的时候不能一次性全部都读取出来 print(dic1) f = open("movie.json", mode="r", encoding="utf-8") for line in f: line = line.strip() if line == "": continue else: d = json.loads(line) # 一行一行的处理 print(d)
五 configparser模块
该模块适⽤于配置⽂件的格式与windows ini文件类似,可以包含一个或多个节(section)每个节 可以有多个参数(键=值). 首先, 我们先看一个xxx服务器的配置文件
import configparser config = configparser.ConfigParser() # 创建对象 config['DEFAULT'] = { # 特殊 "name":"腾讯qq木马", "time":"qq更新时间", "version":"1.0" } config['SERVER_1'] = { "IP":"192.168.1.123", "port":"12306" } config['SERVER_2'] = { "IP":"192.168.1.178", "port":"12311" } config['SERVER_3'] = { "IP":"192.168.1.176", "port":"12312" } # 写入到文件 config.write(open("qq.ini", mode="w", encoding="utf-8")) # 读取内容 config = configparser.ConfigParser() # 读取内容 config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config print(config['SERVER_1']['IP']) # 字典 print(config['SERVER_2']['name']) print(config.get("SERVER_3", "IP")) # 字典 for k, v in config['DEFAULT'].items(): print(k, v) # config = configparser.ConfigParser() # # 读取内容 # config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config # config['SERVER_1']['NAME'] = "哈哈哈" # config.write(open("qq.ini", mode="w", encoding="utf-8"))
# 先读取. 然后修改. 最后写回文件 config = configparser.ConfigParser() config.read("db.ini") # 读取文件 # 添加一个章节 # config.add_section("189-DB") # config["189-DB"] = { # "db_ip": "167.76.22.189", # "port": "3306", # "u_name": "root", # "u_pwd": "123456" # } # 修改信息 config.set("168-DB", "db_ip", "10.10.10.168") # 删除章节 config.remove_section("173-DB") # 删除元素信息 config.remove_option("168-DB", "u_name") # 写回文件 config.write(open("db.ini", mode="w"))