python中常用的模块二

时间:2022-10-05 08:55:39

一.序列化

指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化,

不同的序列化结果不同,但目的是一样的,都是为了存储和传输.

一,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+"\n") 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"))