Day23--Python--常用模块02--序列化,configparser

1. 序列化
把对象打散成bytes或者字符串。 方便存储和传输 序列化
把bytes或者字符串转换回对象。 反序列化

2. pickle(比较重要)
把python中所有的对象都可以转化成bytes。进行存储和传输
dumps() 序列化。 写在内存中,不写文件.
loads() 反序列化, 从内存中读,不读文件.
dump()
load()
# dumps()序列化, loads() 反序列化

import
pickle # dumps 序列化。 把对象转化成bytes # loads 反序列化。 把bytes转化成对象 # dump 序列化。 把对象转化成bytes并写入文件 # load 反序列化。把文件中的bytes读取。转化成对象 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) c.catchMouse() # dumps 把对象转化成bytes 序列化 bs = pickle.dumps(c) print(bs) # 把bytes 转换回对象 反序列化 ccc = pickle.loads(bs) ccc.catchMouse()
dic = {"jay": "周杰伦", "jj": "大阳哥"}
bs = pickle.dumps(dic)
print(bs)

d = pickle.loads(bs)
print(d)
View Code  dumps()& loads()
# dump()序列化写入文件, load()序列化从文件读取

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) f = open("pickle-test", mode="wb") pickle.dump(c, f) # 结果人是看不了的。 f.close() f = open("pickle-test", mode="rb") c = pickle.load(f) c.catchMouse() f.close()
import pickle
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

lst = [Cat('猫1', 10), Cat('猫2', 9), Cat('猫3', 0), Cat('猫4', 7), Cat('猫5', 6)]
f = open('pickle-test', mode='wb')
for el in lst:
    pickle.dump(el, f)

f.flush()
f.close()
f = open('pickle-test', mode='rb')

while 1:
    try:
        c = pickle.load(f)    # 迭代着拿
        print(c.name)
    except EOFError:
        break
import pickle
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

lst = [Cat('猫1', 10), Cat('猫2', 9), Cat('猫3', 0), Cat('猫4', 7), Cat('猫5', 6)]
# f = open('pickle-test', mode='wb')
# pickle.dump(lst, f)  # 知道列表长度不是很长,可以直接装进去

f = open('pickle-test', mode='rb')
lst1 = pickle.load(f)
for i in range(0, len(lst1)):
    print(lst1[i].name)

f.close()

3. shelve
小型数据库. 操纵的是文件类型的字典.
shelve.open(文件, writeback=True)
import shelve
# 打开一个文件
f = shelve.open('阿拉斯加', writeback=True)
f['jj'] = '林俊杰'        # f = {}  # 像字典一样操作
f['jay'] = '周杰伦'

print(f['jay'])

f['jay'] = {'name': '周杰伦', 'age': 18, 'hobby': '唱歌'}  # 如果不加writeback=True则只能在内存层面修改,不能修改文件
print(f['jay'])
f['jay']['name'] = '风火轮'
print(f['jay'])
f.close()
# 像字典一样使用
import shelve
f = shelve.open('阿拉斯加')
print(f.keys())
for k in f.keys():
    print(k)

for k in f:
    print(k)

for k, v in f.items():
    print(k, v)

f.close()

4. json(重点)
前后端数据交互的通用的数据格式。
dumps() 把字典转化成字符串
loads() 把字符转化成字典
   dump(s, f) 在写入文件的时候, 必须用双引号 "", 不能识别单引号''
load(f)

处理中文
ensure_ascii = False
import json
dic = {'a': '李茶的姑妈', 'b': '巨齿鲨', 'c': '看不见的客人'}
s = json.dumps(dic)     # 如果你的key或者value超出了ascii范畴。 就会显示成uxxxxx
print(s)
s1 = json.dumps(dic, ensure_ascii=False)    # 干掉ascii码
print(s1)
print(repr(s1), type(s))  # 使用repr便于区分s1的类型是字典还是字符串

# 把字符串解析成 字典
dic1 = json.loads(s)
dic2 = json.loads(s1)
print(dic1, type(dic1))
print(dic2, type(dic2))
# json.dump() 和 json.load()

import json
# 写入
dic = {"a": '李茶的姑妈', "b": "找到你", "c": "看不见的客人"}
f = open('waimai.json', mode='w', encoding='utf-8')
json.dump(dic, f, ensure_ascii=False)      # 缺点: 放入字典时不会换行
f.close()

# 读出
f = open('waimai.json', mode='r', encoding='utf-8')
s = json.load(f)  # 把文件中的json串读取成字典
print(s, type(s))
f.close()
import json
lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}]
f = open("menu.json", mode="w", encoding="utf-8")
for dic in lst:
    json.dump(dic, f, ensure_ascii=False)
f.close()

f = open("menu.json", mode="r", encoding="utf-8")
s = json.load(f)
print(s)    # 报错 json.dump()不能换行, 所以json只建议使用dumps & loads()
# 写入的时候
# 1. 循环
# 2. 用dumps把字典转化成字符串, 然后手工在后面加一个

# 3. 写出
f = open("new_menu.json", mode="w", encoding="utf-8")
lst = [{"a": "胡辣汤"},{"b":"吱吱冒油的大猪蹄子"},{"c": "盖浇饭"},{"d":"马拉"},{"e":"法国大蜗牛"}]
for el in lst:
    s = json.dumps(el, ensure_ascii=False) + "
"
    f.write(s)

f.flush()
f.close()


# 读取的时候
# 1. for line in f:
# 2. strip()去掉空白
# 3. loads()变成字典

f = open("new_menu.json", mode="r", encoding="utf-8")
for line in f:
    line = line.strip()
    dic = json.loads(line)
    print(dic)

5. configparser
处理配置文件的。
把配置文件作为一个大字典来处理就型了
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) # 把文件扔进去。 写到这个文件里

f.close()
import configparser

# 读取内容
conf = configparser.ConfigParser()
conf.read("db.ini")
print(conf.sections()) # 获取到章节 keys()
print(conf['166-DB']["ip"])  # 可以像字典一样操作
print(conf["166-DB"]["port"])
print(conf["166-DB"]["uname"])
print(conf["166-DB"]["password"])

for key in conf['163-DB']:
    print(key)

for key, value in conf['163-DB'].items():
    print(key, value)
import configparser

# 增删改操作
conf = configparser.ConfigParser()
conf.read("db.ini") # 读取出来

conf['163-DB']['uname'] = "alex"
# del conf['163-DB']["password"]
conf.set("163-DB", "wangermazi", "189") # setattr

conf.add_section("jay")
conf.write(open("db.ini", mode="w"))
原文地址:https://www.cnblogs.com/surasun/p/9760534.html