python常用模块2(序列化,pickle,shelve,json,configparser)
在我们存储数据或者网络传输数据的时候. 需要对我们的对象进行处理. 把对象处理成方便存储和传输的数据格式. 这个过程叫序列化. 不同的序列化, 结果也不同. 但是目的是⼀样的. 都是为了存储和传输.
在Python中有三种序列化的方案:
一.pickle
把任意类型数据转化成bytes并写入到文件中.同样也可以把文件中写好的bytes转换回python的数据,后面的,这个过程被称为反序列化.
序列化并写入文件中,再读取
import pickle
class Cat:
def __init__(self,name,age):
self.name=name
self.age=age
def catMouse(self):
print(self.name,"抓老鼠")
c = Cat("maomi",3)
bs = pickle.dumps(c) #序列化一个对象,得到一堆二进制数据给机器看的
print(bs)
#b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x05\x00\x00\x00maomiq\x04X\x03\x00\x00\x00ageq\x05K\x03ub.'
f = open("cat",mode="wb")
pickle.dump(c,f) #写入到cat文件中
f.close()
f = open("cat", mode="rb")
cc = pickle.load(f) # 从文件中读取对象<__main__.Cat object at 0x000001F1DA5E7CC0>
cc.catMouse() #maomi 抓老鼠
二. shelve
能够把数据写到硬盘上,操作shleve很像操作一个字典.
import shelve
str = shelve.open("ccj", writeback=True)
del s['jay']
s.close()
三.json
json全称javascript object notation. 翻译过来叫js对象简谱.json是我们前后端交互的枢纽.,相当于编程界的普通话.
json.dumps(dic)
import json
dic = {"a": "女王", "b": "萝莉", "c": "小清新","d":None}
j=json.dumps(dic,ensure_ascii=False) #把字典转化成json字符串
print(j) # {"a": "女王", "b": "萝莉", "c": "小清新", "d": null}
把前端传递过来的json字符串转化成字典.
import json
s2 = '{"a": "女王", "b": "萝莉", "c": "小清新", "d": null}'
dic2 = json.loads(s2)
print(type(dic2), dic2)
#<class 'dict'> {'a': '女王', 'b': '萝莉', 'c': '小清新', 'd': None}
四.configgparser
该模块适用于配置文件的格式与windows ini⽂件类似,可以包含⼀个或多个节(section)每个节可以有多个参数(键=值).
用configparser就可以对这样的文件进行处理理.首先, 是初始化.
import configparser
config = configparser.ConfigParser()
config['DEFAULT'] = {
"sleep": 1000,
"session-time-out": 30,
"user-alive": 999999
}
config['TEST-DB'] = {
"db_ip": "192.168.17.189",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
config['168-DB'] = {
"db_ip": "152.163.18.168",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
config['173-DB'] = {
"db_ip": "152.163.18.173",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
f = open("db.ini", mode="w")
config.write(f) # 写⼊文件
f.flush()
f.close()
读取文件信息:
config = configparser.ConfigParser()
config.read("db.ini") # 读取文件
print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息
print(config.get("DEFAULT", "SESSION-TIME-OUT"))
# 从xxx章节中读取到xxx信息
# 也可以像字典⼀样操作
print(config["TEST-DB"]['DB_IP'])
print(config["173-DB"]["db_ip"])
for k in config['168-DB']:
print(k)
for k, v in config["168-DB"].items():
print(k, v)
print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有键
print(config.items('168-DB')) #找到'168-DB'下所有键值对
print(config.get('168-DB','db_ip'))
# 152.163.18.168 get方法Section下的key对应的value
增删改操作:
# 先读取. 然后修改. 最后写回文件
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"))